XSL在转换后删除特定的空元素

时间:2014-02-13 18:15:04

标签: xml xslt xpath transformation

我想删除特定元素,如果转换后它不包含子元素

我将重新描述最接近我真实问题的例子 我有一个参数让我们称它为“param” 我想删除值小于“param”

值的元素的所有子元素

而我想要的是什么时候没有孩子,然后将完全删除 我希望我很清楚

我有以下XML

<a>
    <b>
        <c>1</c>
        <c>2</c>
    </b>
    <d></d>
</a>

xsl

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
 <xsl:strip-space elements="*"/>
 <xsl:param name="myparam" select="4" /> 

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

    <xsl:template match="/a/b/c">
         <xsl:if test="text() &gt; $myparam">  
           <xsl:apply-templates select="text()"/>
         </xsl:if>
    </xsl:template>

</xsl:stylesheet>

结果是

<a>
   <b/> <!-- for this example all children are less than myParam=4 so if b has no child then i want to remove it  -->
   <d/>
</a>

感谢您的帮助

2 个答案:

答案 0 :(得分:0)

如果您要删除拥有子项的a下的元素,您可以使用:

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

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

    <xsl:template match="a/*[node()]"/>

</xsl:stylesheet>

答案 1 :(得分:0)

强调我自己:

  

我想删除特定元素,如果转换后 它不包含子

通常,XSLT在原始XML 上运行,而不是在自己的输出上运行。但是,你要求的不是。您有几个选择:

  1. 使用您的宿主语言执行第二次转换。换句话说,编写一个样式表来转换文档,然后编写另一个样式表来对第一个样式表的输出执行第二次传递。

  2. 使用XSLT 2存储节点集,然后对其进行操作

  3. 使用支持exsl:node-set()扩展程序的处理器执行相同的操作

  4. 重写样式表以在第一遍中生成所需的输出。这不是总是可能,但有时它是。

  5. 关于第二点和第三点的更多信息可以在这个问题中找到: