我想删除特定元素,如果转换后它不包含子元素
我将重新描述最接近我真实问题的例子 我有一个参数让我们称它为“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() > $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>
感谢您的帮助
答案 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 源上运行,而不是在自己的输出上运行。但是,你要求的不是。您有几个选择:
使用您的宿主语言执行第二次转换。换句话说,编写一个样式表来转换文档,然后编写另一个样式表来对第一个样式表的输出执行第二次传递。
使用XSLT 2存储节点集,然后对其进行操作
使用支持exsl:node-set()
扩展程序的处理器执行相同的操作
重写样式表以在第一遍中生成所需的输出。这不是总是可能,但有时它是。
关于第二点和第三点的更多信息可以在这个问题中找到: