2

我想使用标识模板来转换 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>

如果有人可以提供帮助,将不胜感激。

谢谢。

4

1 回答 1

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>
于 2012-10-10T13:09:24.643 回答