XSLT-替换XML文档中重复出现的部分(在任何级别)
专业人士, 我需要将以下文档中的“B”标记转换为“X”标记:XSLT-替换XML文档中重复出现的部分(在任何级别),xslt,Xslt,专业人士, 我需要将以下文档中的“B”标记转换为“X”标记: <a> <B marker="true"> <c> <B marker="true"> <d> <B marker="true"> </B> <d> </B> </c> </B> </a> 注意重复出现
<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的观点:当谈论规则时,一个人说某个规则覆盖了另一个规则。