xml - XPath 能否仅返回具有 X 子级且具有命名空间的节点?

标签 xml xpath

这个问题是Can XPath return only nodes that have a child of X?的延续.

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

是否可以使用 XPath 仅选择具有特定子元素的节点?例如,在此 XML 中,我只需要 pets 中具有“bar”子级的元素。因此生成的数据集将包含蜥蜴和 pig 元素。

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

任何建议都会很有效。

最佳答案

For example, from this XML I only want the elements in pets that have a child of '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>

关于xml - XPath 能否仅返回具有 X 子级且具有命名空间的节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11007152/

相关文章:

c# - 如何计算包含特定值的 XML 节点数

java - 如何使用 Selenium 和 Java 单击“确认”按钮

java - findViewById(int) 在 Android 3.1 中的一个特定按钮上返回 null 其他版本很好

java - R.string 不显示我在 res/values/strings.xml 中手动定义的字符串

Spring MVC 中的 XML 文件下载

java - 是否有一个 XPath 表达式可以从两个不同的位置获取值?

python - 如何从 "Health"元素中提取文本

python - 无法找到带有类名的元素,无法找到带有 xpath 的元素 - Selenium,Python, `ERR_SSL_VERSION_OR_CIPHER_MISMATCH`

asp.net - XPath 不返回节点值 ASP.NET 4.5

java - 由于 "No package identifier when getting value of resource number..."而崩溃