1

这个问题是 XPath 是否只返回具有 X 的子节点的节点的延续.

我想找到所有有 foo 的“宠物”,其中一些宠物有命名空间,而其他宠物没有。

是否可以使用 XPath 仅选择具有特定子元素的节点?例如,从这个 XML 中,我只想要 pets 中具有“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>

任何建议都会动摇。

4

1 回答 1

3

例如,从这个 XML 中,我只想要 pets 中具有“bar”子项的元素。

使用

/*/*[*[local-name() = 'bar']]

这将选择顶部元素的所有子元素,这些子元素至少具有一个具有本地名称"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>
于 2012-06-13T02:04:17.877 回答