-2

<a></a>ノード値がわかっている XML からすべてのタグの出現を削除したいと考えています。

たとえば、XML には複数の が含まれており<a>123</a>、ノードの値が一致する場合は123、すべてのノードを XML から削除する必要があります。

XSLT コードについて教えてください。

入力 XML :

<z>
<b>
   <a>123</a>
   <c>
     <a>123</a>
     <d>text</d>
   </c>
   <e>
      <f>xyz></f>
      <a>123</a>
   </e>
</b>
<f>
    <a>345</a>
</f>
<g>
    <a>123</a>
    <h>
      <a>123</a>
      <i></i>
    </h>
</g>
</z>

期待される出力:

<z>
<b>

   <c>

     <d>text</d>
   </c>
   <e>
      <f>xyz&gt;</f>

   </e>
</b>
<f>
    <a>345</a>
</f>
<g>

    <h>

      <i/>
    </h>
</g>
</z>

コードを次のように使用しました

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:output method="xml" indent="yes" encoding="UTF-8" omit-xml-declaration="yes" />
   <xsl:template match="node()|@*" >
       <xsl:copy >
           <xsl:apply-templates select="node()|@*" />
       </xsl:copy >
   </xsl:template >
   <xsl:template match="z/b/a|z/b/c/a|z/b/e/a|z/g/a|z/g/h/a" />
</xsl:stylesheet >

ただし、入力 XML が異なる場合があるため、パスのハードコーディングが常に機能するとは限りません。

ノードの値を「123」としてチェックし、それらのノードのみを削除するための一般的なコードを提案してください。

前もって感謝します。

4

2 に答える 2

0
<?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" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:template match="node()|@*">
        <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match = "a[text() = '123']"/>
</xsl:stylesheet>

出力:

<?xml version="1.0" encoding="UTF-8"?>
<z>
    <b>
        <c>
            <d>text</d>
        </c>
        <e>
            <f>xyz&gt;</f>
        </e>
    </b>
    <f>
        <a>345</a>
    </f>
    <g>
        <h>
            <i/>
        </h>
    </g>
</z>

このコードは、値として「123」を持つすべてのノードを削除します..

<?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" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:template match="node()|@*">
        <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match = "node()[text() = '123']"/>
</xsl:stylesheet>
于 2013-11-14T07:22:50.360 に答える
0

まず恒等変換と のオーバーライドから始めます<a>123</a>

詳細については、これらをご覧ください。

XSLT 2.0

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="a[text()='123']"/>

</xsl:stylesheet>
于 2013-11-14T07:20:31.557 に答える