如何在XPath中选择root根节点并排除子节点e?
搞定XPath选root节点并排除指定子节点的问题
问题情况
给定的XML文档是这样的:
<root> <a></a> <b></b> <c></c> <d></d> <e></e> </root>
现在要选中root节点本身,还要带上它所有子节点,但得把e节点排除掉。之前试了//root/*[not(name() = 'e')],结果只能选中符合条件的子节点,root节点没包含进去,想要的结果是:
<root> <a></a> <b></b> <c></c> <d></d> </root>
解决办法
得调整XPath表达式,既要匹配root节点,又要过滤它的子节点,给你几种可行的写法:
方法一:用copy-of过滤子节点(XPath 2.0及以上可用)
直接用这个表达式,既能选中root,又能把e子节点去掉:
copy-of //root[*[not(name()='e')]]
换成self::e的写法也可以:
copy-of //root[*[not(self::e)]]
方法二:用模板构造节点(适合XSLT场景)
如果是在XSLT里处理,写个模板就能实现:
<xsl:template match="root"> <root> <xsl:copy-of select="*[not(name()='e')]"/> </root> </xsl:template>
意思就是复制root节点,然后只把非e的子节点复制进去。
方法三:兼容XPath 1.0的写法
如果只能用XPath 1.0,可以用节点集合并的方式:
//root | //root/*[not(name()='e')]
不过这种写法返回的是节点序列,得看工具能不能自动把它们组合成完整的root结构,部分工具可能需要额外处理一下。
内容的提问来源于stack exchange,提问作者MLEN
相关产品推荐
相关产品推荐

