XSLT将父节点名称添加为子节点中的元素

时间:2013-12-20 15:04:19

标签: xml xslt xslt-1.0

输入

<root>
    <category1>
        <node>
            <subnode>value</subnode>
        </node>
    </category1>

    <category2>
        <node>
            <subnode>value</subnode>
        </node>
    </category2>
</root>

输出

<root>
    <node>
        <subnode>value</subnode>
        </category1>
    </node>

    <node>
        <subnode>value</subnode>
        </category2>
    </node>
</root>

或者

<root>
    <node>
        <subnode>value</subnode>
        <status>category1</status>
    </node>

    <node>
        <subnode>value</subnode>
        <status>category2</status>
    </node>
</root>

尝试

<xsl:template match="//node">
    <xsl:copy>
        <xsl:copy-of select="child::node()" />
        <xsl:copy-of select=".." />
        <!--
        Why isn't something like this possible? 
        <xsl:copy-of select="ancestor::local-name()"/> 
        -->
    </xsl:copy>
</xsl:template>

详情

希望上面的内容足够清楚:)。

<小时/> <小时/>

其他详细信息(可选)

对于那些在今年圣诞节特别慷慨的人,我邀请你继续阅读:D。

我在学习XSLT时遇到了一些麻烦,觉得我缺少一些通用/语法概念,但我还需要做一些“复杂”的转换。例如:

输入

<root>
    <category1>
        <node>
            <name>category1 node pk</name>
        </node>
    </category1>

    <groups>
        <node>
            <name>First Group</name>
            <members>
                <name>category1 node pk</name>
            </members>
        </node>

        <node>
            <name>Second Group</name>
            <members>
                <name>category1 node pk</name>
            </members>
        </node>
    </groups>
</root>

输出

<root>
    <node>
        <name>category1 node pk</name>
        <group>All</group>
        <status>category1</status>
    </node>

    <node>
        <name>category1 node pk</name>
        <group>First Group</group>
        <status>category1</status>
    </node>

    <node>
        <name>category1 node pk</name>
        <group>Second Group</group>
        <status>category1</status>
    </node>
</root>

那么对于XSLT专家来说,我想知道你是如何学习 XSLT 1.0 的?特别是处理更复杂的变换。

您发现是否有任何书籍或教程特别有用?

最后你认为新手能够多长时间才能在没有帮助的情况下完成上述转变?

2 个答案:

答案 0 :(得分:2)

<xsl:copy-of select="ancestor::local-name()"/>的语法是<xsl:value-of select="name(..)"/>。完整代码中的插槽位于

之下
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="root">
    <xsl:copy>
        <xsl:apply-templates/>
    </xsl:copy>
</xsl:template>
<xsl:template match="root/*">
    <xsl:apply-templates/>
</xsl:template>
<xsl:template match="*">
    <xsl:copy>
        <xsl:copy-of select="*"/>
        <status><xsl:value-of select="name(..)"/></status>
    </xsl:copy>
</xsl:template>
</xsl:stylesheet>

并为您提供输出

<?xml version="1.0" encoding="UTF-8"?>
<root>
<node>
    <subnode>value</subnode>
    <status>category1</status>
</node>
<node>
    <subnode>value</subnode>
    <status>category2</status>
</node>
</root>

根据要求

答案 1 :(得分:1)

这应该可以帮助您入门。我知道你的实际XML输入比这更复杂,但是这会产生你描述的输出(对于看起来如果你感觉很慷慨的部分)。

<?xml version="1.0" encoding="utf-8"?>

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

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

<xsl:template match="/">
  <xsl:apply-templates/>
</xsl:template>

<xsl:template match="root">
  <xsl:copy>
     <xsl:apply-templates/>
  </xsl:copy>
</xsl:template>

<xsl:template match="category1">
  <node>
     <name>
        <xsl:value-of select="node/name"/>
     </name>
     <group>
        <xsl:text>ALL</xsl:text>
     </group>
     <status>
        <xsl:text>category1</xsl:text>
     </status>
  </node>
</xsl:template>

<xsl:template match="groups">
  <xsl:for-each select="node">
     <node>
        <name>
           <xsl:value-of select="members/name"/>
        </name>
        <group>
           <xsl:value-of select="name"/>
        </group>
        <status>
           <xsl:text>category1</xsl:text>
        </status>
     </node>
  </xsl:for-each>
</xsl:template>

</xsl:stylesheet>

您将获得以下输出:

<?xml version="1.0" encoding="UTF-8"?>
<root>
  <node>
    <name>category1 node pk</name>
    <group>ALL</group>
    <status>category1</status>
 </node>

 <node>
    <name>category1 node pk</name>
    <group>First Group</group>
    <status>category1</status>
 </node>
 <node>
  <name>category1 node pk</name>
  <group>Second Group</group>
  <status>category1</status>
 </node>
</root>

现在,关于学习XSLT的问题。如果您有关于这一主题的书籍,Michael Kay的“XSLT 2.0和XPATH的程序员参考”是目前最好的资源,如果您不介意技术细节。例如,请参见:http://www.wrox.com/WileyCDA/WroxTitle/productCd-0764569090.html