作为我的XSLT学习曲线的一部分。我遇到了以下情况并试图完成它。
我有以下格式的xml。
<parent>
<A> .. </A>
<T1>
<d1>..</d1>
<d2>..</d2>
</T1>
<T1>
<d1>..</d1>
<d2>..</d2>
</T1>
...
<T1>
<d1>..</d1>
<d2>..</d2>
</T1>
</parent>
我试图将节点'A'移到T1,T1 ...... T1之下。所以最终输出看起来像这样
<parent>
<T1>
<A> .. </A>
<d1>..</d1>
<d2>..</d2>
</T1>
<T1>
<A> .. </A>
<d1>..</d1>
<d2>..</d2>
</T1>
...
<T1>
<A> .. </A>
<d1>..</d1>
<d2>..</d2>
</T1>
</parent>
以下是我一直在使用的xslt
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:DTCC="http://www.informatica.com/B2B/DTCC/NSCC/2014_03">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="@*|node()" name="identity">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:variable name="submittingHeader">
<xsl:copy-of select="./A/*" />
</xsl:variable>
<xsl:template match="T1" >
<xsl:value-of select="$submittingHeader"/>
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
这里我试图将至少节点A移动到T1以下。如果我得到了,那么我将把每个循环放在匹配的模板T1上。
我看到的输出与输入xml相同。我没有看到节点'A'在'T1'下移动。我想我没有正确复制变量的内容或我错过了什么?任何指导
答案 0 :(得分:2)
我认为你做得不好:
submittingHeader
变量未选择A
节点(您应该使用//A
,因为该变量位于任何模板之外)A
元素A
T1
这应该产生预期的结果:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:DTCC="http://www.informatica.com/B2B/DTCC/NSCC/2014_03">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<!-- avoid copying A in its original position -->
<xsl:template match="A"/>
<xsl:template match="T1" >
<xsl:copy>
<!-- copy A inside the copied T1 -->
<xsl:copy-of select="../A" />
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>