如何使用XSLT根据其值删除多个节点?

时间:2013-11-14 04:50:34

标签: xslt output

我想从已知节点值的XML中删除所有<a></a>个标记。

例如,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'并仅删除那些节点。

提前谢谢。

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分: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>