这个问题是Can XPath return only nodes that have a child of X?的延续。
我想找到所有拥有foo的“宠物”,其中一些宠物有命名空间而其他宠物没有。
是否可以使用XPath仅选择具有特定子元素的节点?例如,从这个XML我只想要宠物中有'bar'子元素的元素。因此,生成的数据集将包含蜥蜴和猪元素。
<pets xmlns="urn:cat-org:v1">
<cat>
<foo>don't care about this</foo>
</cat>
<dog xmlns:v1="urn:cat-org:v1">
<v1:foo>not this one either</foo>
</dog>
<lizard>
<bar>lizard should be returned, because it has a child of bar</bar>
</lizard>
<pig xmlns:v55="urn:cat-org:v1">
<v55:bar>return pig, too</bar>
</pig>
</pets>
任何建议都会摇滚。
答案 0 :(得分:3)
例如,从这个XML我只想要宠物中的元素 “酒吧”的孩子。
使用强>:
/*/*[*[local-name() = 'bar']]
这将选择top元素中至少有一个具有本地名称"bar"
的子元素的所有子元素(如果存在,则不管前缀如何)。
基于XSLT的验证:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<xsl:copy-of select="/*/*[*[local-name() = 'bar']]"/>
</xsl:template>
</xsl:stylesheet>
将此转换应用于提供的XML文档(更正为格式正确):
<pets xmlns="urn:cat-org:v1">
<cat>
<foo>don't care about this</foo>
</cat>
<dog xmlns:v1="urn:cat-org:v1">
<v1:foo>not this one either</v1:foo>
</dog>
<lizard>
<bar>lizard should be returned, because it has a child of bar</bar>
</lizard>
<pig xmlns:v55="urn:cat-org:v1">
<v55:bar>return pig, too</v55:bar>
</pig>
</pets>
评估XPath表达式并将所选元素复制到输出:
<lizard xmlns="urn:cat-org:v1">
<bar>lizard should be returned, because it has a child of bar</bar>
</lizard>
<pig xmlns="urn:cat-org:v1" xmlns:v55="urn:cat-org:v1">
<v55:bar>return pig, too</v55:bar>
</pig>