2

特定のノードを除外しながら、IDテンプレートを使用して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 に答える