【问题标题】:Can XPath return only nodes that have a child of X - with namespaces?XPath 能否仅返回具有 X 子节点的节点 - 带有命名空间?
【发布时间】:2012-06-13 01:38:44
【问题描述】:

这个问题是Can XPath return only nodes that have a child of 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>

任何建议都会动摇。

【问题讨论】:

    标签: xml xpath


    【解决方案1】:

    例如,从这个 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>
    

    【讨论】:

    • 谢谢伙计。我错过了 [[ using local-name() 之间的 *
    猜你喜欢
    • 2010-09-11
    • 2010-10-06
    • 2021-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-10
    相关资源
    最近更新 更多