xslt合并2个父母的孩子并存储在变量中

时间:2018-07-24 08:39:55

标签: xpath xslt-1.0 xslt-2.0 xslt-3.0

我收到这样的xml输入:

  <root>
    <Tuple1>
      <child11></child11>
      <child12></child12>
      <child13></child13>
    </Tuple1>
    <Tuple1>
      <child11></child11>
      <child12></child12>
    </Tuple1>

    <Tuple2>
      <child21></child21>
      <child22></child22>
    </Tuple2>
    <Tuple2>
      <child21></child21>
      <child22></child22>
      <child23></child23>
    </Tuple2>
  </root>

我如何将每个Tuple1的孩子与Tuple2的孩子合并,并将它们存储在变量中,该变量将在xslt文档的其余部分中使用? 第一个Tuple1将与第一个Tuple2合并,第二个Tuple1将与第二个Tuple2合并,依此类推。应该存储在变量中的合并输出在内存中看起来像这样:

<root>
    <Tuple1>
      <child11></child11>
      <child12></child12>
      <child13></child13>

      <child21></child21>
      <child22></child22>
    </Tuple1>
    <Tuple1>
      <child11></child11>
      <child12></child12>

      <child21></child21>    
      <child22></child22>
      <child23></child23>
    </Tuple1>
  </root>

变量是最好的选择吗?如果我们使用变量,它是一次创建还是每次调用都创建? 我使用xslt 3.0,因此任何版本的解决方案都可以提供帮助。 谢谢,感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

这是最小的XSLT 3方法:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="3.0">

  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="root">
     <xsl:variable name="temp1">
         <xsl:copy>
             <xsl:apply-templates select="Tuple1"/>
         </xsl:copy>
     </xsl:variable>
     <xsl:copy-of select="$temp1"/>
  </xsl:template>

  <xsl:template match="Tuple1">
      <xsl:copy>
          <xsl:copy-of select="*, let $pos := position() return ../Tuple2[$pos]/*"/>
      </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty-development.net/bdxtqg在线上,我使用XPath的let而不是XSLT的xsl:variable来存储访问特定Tuple2的位置。