我收到这样的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,因此任何版本的解决方案都可以提供帮助。 谢谢,感谢您的帮助。
答案 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
的位置。