更改现有xml标记并添加新xml标记的XSL代码
我有以下示例XML文件,其中包含1000个标记更改现有xml标记并添加新xml标记的XSL代码,xml,xslt,Xml,Xslt,我有以下示例XML文件,其中包含1000个标记 <AAA> <BBB> <CCC> <DDD> <EEE> <1>abc</1> <2>abc</2> <3>abc</3> <4>abc</4> </EEE> </DDD> </CCC&
<AAA>
<BBB>
<CCC>
<DDD>
<EEE>
<1>abc</1>
<2>abc</2>
<3>abc</3>
<4>abc</4>
</EEE>
</DDD>
</CCC>
</BBB>
</AAA>
abc
abc
abc
abc
我需要将其转换为以下内容(添加带有两个子标记的标记5并更新标记1)
kkkkkkk
abc
abc
abc
abc
abc
我不能同时做这两件事,即我可以更新标记1或添加标记5。我需要两者都能做到。我使用以下xsl转换添加标记5
<xsl:template match="@* | node()" name="identity-copy">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="e:AAA/e:BBB/e:CCC/e:DDD/e:EEE">
<xsl:copy>
<xsl:copy-of select="*"/>
<5>
<a>abc</a>
<b>abc</b>
</5>
</xsl:copy>
</xsl:template>
abc
abc
无论我尝试什么,我都无法更新标记1-select=“*”的副本似乎覆盖了它。
任何关于如何实现更新和添加的想法都非常感谢。简单,-只需从您的副本中排除
(但是XML名称不能以数字开头,所以我称之为
和
):
kkkkkkkkkk
abc
abc
只有当您想替换第一个元素并在最后附加一个新元素时,上述方法才真正有效,在所有其他情况下,它会打乱元素顺序
假设要替换
,使用与
匹配的模板会更好,因为它可以保持输入元素的顺序:
<xsl:template match="e:AAA/e:BBB/e:CCC/e:DDD/e:EEE">
<xsl:copy>
<xsl:apply-templates select="*" />
<tag5>
<a>abc</a>
<b>abc</b>
</tag5>
</xsl:copy>
</xsl:template>
<xsl:template match="tag2">
<xsl:copy>zzzzzzzzzz</xsl:copy>
</xsl:template>
abc
abc
zzzzzzzz
使用
的方法比使用
的方法更灵活:要在
之后插入新元素,可以使用以下模板:
<xsl:template match="tag3">
<xsl:copy-of select="." />
<tag3-1>zzzzzzzzzz</tag3-1>
</xsl:template>
zzzzzzzz
哇,谢谢托马拉克。我对XSLT的了解很少,仅限于黑客。我一直在把头发扯得乱七八糟,很高兴听到这对你有帮助!我在更新上面的tag2时遇到了一个问题。我必须使用e:tag2(默认为ns)。我可以使用zzzz更改值,但我需要使用计算。我试过使用
应该可以。
<xsl:template match="e:AAA/e:BBB/e:CCC/e:DDD/e:EEE">
<xsl:copy>
<xsl:apply-templates select="*" />
<tag5>
<a>abc</a>
<b>abc</b>
</tag5>
</xsl:copy>
</xsl:template>
<xsl:template match="tag2">
<xsl:copy>zzzzzzzzzz</xsl:copy>
</xsl:template>
<xsl:template match="tag3">
<xsl:copy-of select="." />
<tag3-1>zzzzzzzzzz</tag3-1>
</xsl:template>