小时候的兄弟姐妹



这是我要翻译的XML。

<?xml version="1.0" encoding="UTF-8" ?>
<Loop xmlns="http://www.example.org">
  <Loop-2000A>
    <Element-628>81</Element-628>
    <Element-734 nil="nil82"/>
    <Element-735>83</Element-735>
    <Element-736>84</Element-736>
  </Loop-2000A>
  <Loop-2000B>
    <Element-1035>85</Element-1035>
    <Element-1036 nil="nil86"/>
    <Element-1037>87</Element-1037>
  </Loop-2000B>
  <Loop-2000B>
    <Element-1035>98</Element-1035>
    <Element-1036 nil="nil86"/>
    <Element-1037>97</Element-1037>
  </Loop-2000B>
  <Loop-2000C>
    <Element-1031>86</Element-1031>
    <Element-1039 nil="nil86"/>
    <Element-1038>25</Element-1038>
  </Loop-2000C>
  <Loop-2000A>
    <Element-628>89</Element-628>
    <Element-734 nil="nil82"/>
    <Element-735>99</Element-735>
    <Element-736>109</Element-736>
  </Loop-2000A>
  <Loop-2000B>
    <Element-1035>208</Element-1035>
    <Element-1036 nil="nil86"/>
    <Element-1037>87</Element-1037>
  </Loop-2000B>
  <Loop-2000C>
    <Element-1031>92</Element-1031>
    <Element-1039 nil="nil86"/>
    <Element-1038>90</Element-1038>
  </Loop-2000C>
  <Loop-2000B>
    <Element-1035>209</Element-1035>
    <Element-1036 nil="nil86"/>
    <Element-1037>97</Element-1037>
  </Loop-2000B>
</Loop>

要求是使...循环2000年的循环2000年。LOOP2000-C在源XML中是可选的。XML中的其他环路应像以前一样在loop-200a之外进行。因此,转换后的XML应该看起来像这样。

<?xml version = '1.0' encoding = 'UTF-8'?>
<ns2:TargetLoop xmlns:ns2="http://www.target.org"> 
  <Loop-2000A>
    <Loop-2000B>
      <Element-1035>85</Element-1035>
      <Element-1036 nil="nil86"/>
      <Element-1037>87</Element-1037>
    </Loop-2000B>
    <Loop-2000B>
      <Element-1035>98</Element-1035>
      <Element-1036 nil="nil86"/>
      <Element-1037>97</Element-1037>
      <Loop-2000C>
        <Element-1031>86</Element-1031>
        <Element-1039 nil="nil86"/>
        <Element-1038>25</Element-1038>
      </Loop-2000C>
    </Loop-2000B>
    <Element-628>81</Element-628>
    <Element-734 nil="nil82"/>
    <Element-735>83</Element-735>
    <Element-736>84</Element-736>
  </Loop-2000A>

  <Loop-2000A>
   <Loop-2000B>
      <Element-1035>208</Element-1035>
      <Element-1036 nil="nil86"/>
      <Element-1037>87</Element-1037>
      <Loop-2000C>
        <Element-1031>92</Element-1031>
        <Element-1039 nil="nil86"/>
        <Element-1038>90</Element-1038>
      </Loop-2000C>
    </Loop-2000B>
    <Loop-2000B>
      <Element-1035>209</Element-1035>
      <Element-1036 nil="nil86"/>
      <Element-1037>97</Element-1037>
    </Loop-2000B>
    <Element-628>89</Element-628>
    <Element-734 nil="nil82"/>
    <Element-735>99</Element-735>
    <Element-736>109</Element-736>
  </Loop-2000A>
</Loop>

任何建议都将不胜感激

在XSLT 2.0中,您可能已经使用 XSL:for-each-group ,使用其 group-group-starting-with 性。但是,在XSLT 1.0中,这可以通过使用键来实现。您可以定义一个钥匙,以查找 loop-2000b 元素的第一个先前的 loop-2000a element

<xsl:key name="B" match="ex:Loop-2000B" use="generate-id(preceding-sibling::ex:Loop-2000A[1])" />

类似地,您可以通过其第一个先前的 loop-loop-200000b elements与 loop-2000c 元素进行关联(尽管您说可能没有必要,但这是不必要的)最多只有一个 loop-200000c 每个 loop-loop-2000b

<xsl:key name="C" match="ex:Loop-2000C" use="generate-id(preceding-sibling::ex:Loop-2000B[1])" />

生成-ID 函数是一个XSLT函数,可用于为每个节点生成唯一ID(如果他们现有的子元素之一可以唯一地识别元素,您也可以使用该元素)。请注意, ex:前缀的使用是因为XML中的所有元素都在命名空间中,因此XSLT需要知道哪些命名空间元素在。

在您的XSLT中,您将仅选择 loop-2000a elements。

<xsl:apply-templates select="ex:Loop-2000A" />

然后,在匹配 ex:loop-2000a 的模板中,您将使用键

选择所有关联的 ex:loop-rop-2000b 元素
<xsl:apply-templates select="key('B', generate-id(current()))" />

您将采用类似的方法来在模板中获取与 ex:loop-200000b 匹配的模板中的 ex:loop-rop-rop-200 c。虽然,如果最多只有一个这样的 ex:loop-loop-rop-200 元素,您可以做到这一点,而在这种情况下不必担心关键:

<xsl:apply-templates select="following-sibling::*[1][self::ex:Loop-2000C]" />

这将获得以下兄弟姐妹元素,但前提是它是 loop-cy-000c element。

最后,可以将其他现有元素与身份转换

匹配并复制
<xsl:template match="@*|node()">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
</xsl:template> 

尝试此XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
     xmlns:ex="http://www.example.org">
  <xsl:output method="xml" omit-xml-declaration="yes" indent="yes" />
  <xsl:key name="B" match="ex:Loop-2000B" use="generate-id(preceding-sibling::ex:Loop-2000A[1])" />
  <xsl:key name="C" match="ex:Loop-2000C" use="generate-id(preceding-sibling::ex:Loop-2000B[1])" />
  <xsl:template match="*[ex:Loop-2000A]">
    <xsl:copy>
      <xsl:apply-templates select="@*"/>
      <xsl:apply-templates select="ex:Loop-2000A" />
      <xsl:apply-templates select="*[not(self::ex:Loop-2000A)][not(self::ex:Loop-2000B)][not(self::ex:Loop-2000C)]" />
    </xsl:copy>
  </xsl:template>
  <xsl:template match="ex:Loop-2000A">
    <xsl:copy>
      <xsl:apply-templates select="@*"/>
      <xsl:apply-templates select="key('B', generate-id(current()))" />
      <xsl:apply-templates />
    </xsl:copy>
  </xsl:template>
  <xsl:template match="ex:Loop-2000B">
    <xsl:copy>
      <xsl:apply-templates select="@*"/>
      <xsl:apply-templates select="key('C', generate-id(current()))" />
      <xsl:apply-templates />
    </xsl:copy>
  </xsl:template>
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

相关内容

  • 没有找到相关文章

最新更新