我对 XSLT 很陌生,我试图复制我已经拥有的现有 XML 文件,但元素已重新排序,但在尝试重新排序孙子时我卡住了。
假设我有这个输入:
<grandParent>
<parent>
<c>789</c>
<b>
<b2>123</b2>
<b1>456</b1>
</b>
<a>123</a>
</parent>
....
</grandParent>
我想要做的是获得相同的 XML 文件,但将标签的顺序更改为 a、b、c,其中 b = b1、b2 按该顺序。所以我从 XSLT 文件开始:
<xsl:template match="node()|@*"> <- This should copy everything as it is
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="grandParent/parent"> <- parent elements will copy in this order
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:copy-of select="a"/>
<xsl:copy-of select="b"/>
<xsl:copy-of select="c"/>
</xsl:copy>
</xsl:template>
但是 "xsl:copy-of select="b"" 复制指定的元素(b2,b1)。我尝试将另一个 xsl:template 用于“grandParent/parent/b”,但无济于事。
也许我没有以正确的方式做事......任何提示?
谢谢!
解决方案 - 感谢 Nils
您的解决方案工作得很好 Nils,我只是对其进行了更多定制以适应我当前的场景,其中“b”是可选的并且标签的名称可能不相关。最终的代码是这样的:
<xsl:template match="node()|@*"> <- This should copy everything as it is
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="grandParent/parent"> <- parent elements will copy in this order
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:copy-of select="a"/>
<xslt:if test="b">
<b>
<xsl:copy-of select="b1"/>
<xsl:copy-of select="b2"/>
</b>
</xslt:if>
<xsl:copy-of select="b"/>
<xsl:copy-of select="c"/>
</xsl:copy>
</xsl:template>