如何将父节点的名称添加到第一个子xsl?

时间:2017-01-17 10:59:21

标签: xml xslt

我有这个xml文件。

Xml输入文件

<Node Name="A100" Id="0x1" Type="1" >
<First Name="First" Val0="0" Val1="8" Val2="3" Val3="4" Val4="8" Val5="3" Val6="4">
<Second Name="N1" Val0="7" Val1="3"/>
<Second Name="N2" Val0="0" Val1="2"/>
<Second Name="N3" Val0="NoFunction" Val1="ab"/>
<Second Name="N4" Val0="0" Val1="xy"/>
</First>
<Second Name="N5" Val="No"/>
<Second Name="N6" Val="No" />
<Second Name="N7" Val="No" />
</Node>
<Node Name="B200" Id="0x2" Type="1" >
<First Name="First" Val0="0" Val1="8" Val2="7" Val3="8" Val4="5" Val5="1" Val6="0">
<Second Name="N1" Val0="7" Val1="3"/>
<Second Name="N2" Val0="0" Val1="2"/>
<Second Name="N3" Val0="NoFunction" Val1="ab"/>
<Second Name="N4" Val0="0" Val1="xy"/>
</First>
<Second Name="N5" Val="No"/>
<Second Name="N6" Val="No" />
<Second Name="N7" Val="No" />
</Node>

我需要使用xsl转换另一个xml文件,如下所示:

Xml输出文件

 <Node Name="A100" Id="0x1" Type="1" >
<First Name="First" New="A100" Val0="0" Val1="8" Val2="3" Val3="4" Val4="8" Val5="3" Val6="4">
<Second Name="N1" Val0="7" Val1="3"/>
<Second Name="N2" Val0="0" Val1="2"/>
<Second Name="N3" Val0="NoFunction" Val1="ab"/>
<Second Name="N4" Val0="0" Val1="xy"/>
</First>
<Second Name="N5" Val="No"/>
<Second Name="N6" Val="No" />
<Second Name="N7" Val="No" />
</Node>
<Node Name="B200" Id="0x2" Type="1" >
<First Name="First" New="B200" Val0="0" Val1="8" Val2="7" Val3="8" Val4="5" Val5="1" Val6="0">
<Second Name="N1" Val0="7" Val1="3"/>
<Second Name="N2" Val0="0" Val1="2"/>
<Second Name="N3" Val0="NoFunction" Val1="ab"/>
<Second Name="N4" Val0="0" Val1="xy"/>
</First>
<Second Name="N5" Val="No"/>
<Second Name="N6" Val="No" />
<Second Name="N7" Val="No" />
</Node>

我希望Node的名称首先像New = @ Name of Node。 谁能帮我这个?谢谢

1 个答案:

答案 0 :(得分:1)

您应该了解XSLT Identity Template

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

这将满足您希望复制的所有节点和属性不变。然后,您只需要一个与First元素匹配的模板,并为其添加新属性......

<xsl:template match="First">
    <First New="{../@Name}">

注意使用花括号,表示Attribute Value Template,因此将被评估为表达式,而不是按字面输出。

试试这个XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml" indent="yes" />

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

    <xsl:template match="First">
        <First New="{../@Name}">
            <xsl:apply-templates select="@*|node()"/>
        </First>
    </xsl:template>
</xsl:stylesheet>