XSLT - 替换XML文档的重新部分(在任何级别)

时间:2011-02-06 12:14:32

标签: xslt

优点, 我需要在以下文档中将'B'标记转换为'X'标记:

<a>
 <B marker="true">
  <c>
    <B marker="true">
      <d>
        <B marker="true">
        </B>
       <d>
    </B>
  </c>
 </B>
</a>

注意重复出现的'B',它可以在动态XML中的任何深度出现。 这是我做的:

<xsl:template match="//*[@marker='true']">
    <X>
        <xsl:copy-of select="./node()"/>
    </X>
</xsl:template>

它适用于最顶级的'B'标签,但忽略了所有嵌套标签。

我想我知道问题是什么 - 'copy-of'只是刷新最顶级'B'标签的内容,而不评估它。如何让“复制”重新评估我的模板?

谢谢! 巴鲁。

1 个答案:

答案 0 :(得分:7)

我会选择身份转换。

此代码:

<?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="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="B[@marker = 'true']">
        <X>
            <xsl:apply-templates/>
        </X>
    </xsl:template>
</xsl:stylesheet>

针对此XML输入:

<a>
    <B marker="true">
        <c test="test">
            testText
            <B marker="true">
                <d>
                    testText2
                    <B marker="true">
                        testText3
                    </B>
                </d>
            </B>
            testText4
        </c>
        testText5
    </B>
</a>

将提供正确的结果:

<a>
    <X>
        <c test="test">
            testText
            <X>
                <d>
                    testText2
                    <X>
                        testText3
                    </X>
                </d></X>
            testText4
        </c>
        testText5
    </X>
</a>