Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
XSLT-替换XML文档中重复出现的部分(在任何级别)_Xslt - Fatal编程技术网

XSLT-替换XML文档中重复出现的部分(在任何级别)

XSLT-替换XML文档中重复出现的部分(在任何级别),xslt,Xslt,专业人士, 我需要将以下文档中的“B”标记转换为“X”标记: <a> <B marker="true"> <c> <B marker="true"> <d> <B marker="true"> </B> <d> </B> </c> </B> </a> 注意重复出现

专业人士, 我需要将以下文档中的“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’标记的内容,而没有对其进行评估。如何使“副本”重新评估我的模板

谢谢!
巴鲁克。

我会选择身份转换

此代码:

<?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>

测试文本
测试文本2
测试文本3
测试文本4
测试文本5
将提供此正确结果:

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

测试文本
测试文本2
测试文本3
测试文本4
测试文本5

我会选择身份转换

此代码:

<?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>

测试文本
测试文本2
测试文本3
测试文本4
测试文本5
将提供此正确结果:

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

测试文本
测试文本2
测试文本3
测试文本4
测试文本5

查看我的答案,利用基本“身份转换”模式。查看我的答案,利用基本“身份转换”模式。谢谢!我自己也在用这个解决方案来回答这个问题。我不知道它有一个名字,但是:)不像是像“singleton”这样的标准名字。我也不是以英语为母语的人,所以名字可能会有所不同。很高兴我提供了帮助:)我倾向于称之为“修改的标识转换”模式,因为第一个模板规则定义了标识转换,第二个模板规则定义了转换与标识转换的不同之处。@Michael Kay,我更喜欢“带覆盖的标识转换”,但这是一样的。我同意@Flack:当谈论规则时,一个人说一些规则覆盖了另一个。谢谢!我自己也在用这个解决方案来回答这个问题。我不知道它有一个名字,但是:)不像是像“singleton”这样的标准名字。我也不是以英语为母语的人,所以名字可能会有所不同。很高兴我提供了帮助:)我倾向于称之为“修改的标识转换”模式,因为第一个模板规则定义了标识转换,第二个模板规则定义了转换与标识转换的不同之处。@Michael Kay,我更喜欢“带覆盖的标识转换”,但这是一样的。我同意@Flack的观点:当谈论规则时,一个人说某个规则覆盖了另一个规则。