Identity XSLT排除某些字段

时间:2012-10-10 13:05:34

标签: xslt identity

我想使用身份模板转换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>

如果有人能提供帮助,我们将不胜感激。

感谢。

1 个答案:

答案 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>