我想使用身份模板转换XML-> XML,同时排除某些节点。
这些节点将位于文档的不同级别 - 下面的示例XML:
<root>
. <item1>
. <contents>
. <fieldA/>
. ...
. <fieldZ/>
. </contents>
. </item1>
. <item2>
. <field1/>
. ...
. <field9/>
. </item2>
</root>
例如,我只想在“root / item1 / contents”中包含“fieldC” 和来自“root / item2”的“field2”。
我的XSLT如下。它不起作用,我认为它是因为我不包括我想要包含的字段的父元素?但我不知道怎么能这样做......
<?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:strip-space elements="*"/>
. <xsl:template match="@* | node()">
. <xsl:copy>
. <xsl:apply-templates select="@* | node()" />
. </xsl:copy>
. </xsl:template>
.
. <xsl:template match="fieldC|field2">
. <xsl:element name="{name()}">
. <xsl:value-of select="text()" />
. </xsl:element>
. </xsl:template>
</xsl:stylesheet>
如果有人能提供帮助,我们将不胜感激。
感谢。
答案 0 :(得分:2)
使用强>:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match=
"item1/contents/*[not(self::fieldC)] | item2/*[not(self::field2)]"/>
</xsl:stylesheet>
对以下XML文档应用此转换时(从提供的草图中派生):
<root>
. <item1>
. <contents>
. <fieldA/>
. <fieldB/>
. <fieldC/>
. ...
. <fieldZ/>
. </contents>
. </item1>
. <item2>
. <field1/>
. <field2/>
. ...
. <field9/>
. </item2>
</root>
产生了想要的,正确的结果(删除了指定的元素):
<root>
. <item1>
. <contents>
.
.
. <fieldC/>
. ...
.
. </contents>
. </item1>
. <item2>
.
. <field2/>
. ...
.
. </item2>
</root>