XPath是否只返回具有X子级的节点 - 具有名称空间?

时间:2012-06-13 01:38:45

标签: xml xpath

这个问题是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>

任何建议都会摇滚。

1 个答案:

答案 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>