XSLT - 用树替换节点

时间:2012-05-16 10:35:47

标签: xml xslt

我有以下源xml

<forms>
  <x>
    <y>
        <x-component select="foobar" />
    </y>
  </x>


  <component name="foobar">
    <some>
        <component>
            <value>text</value>
        </component>
    </some>
  </component>
</forms>

我正在尝试将其转换为以下内容:

<?xml version="1.0" encoding="UTF-8"?>
<forms>
    <x>
        <y>
            <component name="foobar">
                <some>
                    <component>
                        <value>text</value>
                    </component>
                </some>
            </component>
        </y>
    </x>
</forms>

我的xsl文件是

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

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

    <xsl:template match="x-component">
        <yoba>
            <xsl:attribute name="z">
                <xsl:value-of select="@select"/>
            </xsl:attribute>
            <xsl:apply-templates select="/forms/component[@name=@select]/*"  />
        </yoba>
    </xsl:template>

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

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

如何为此行传递当前节点的select属性的值(而不是PLACEHOLDER):

<xsl:apply-templates select="/forms/component[@name=<PLACEHOLDER>]/*"  />

1 个答案:

答案 0 :(得分:2)

使用current()/@select。或者更好地定义键<xsl:key name="k1" match="component" use="@name"/>和do <xsl:apply-templates select="key('k1', @select)"/>