xpath - XPath 1.0:选择具有给定父节点的所有子节点,如果父节点没有这样的子节点,则选择空?

标签 xpath vtd-xml

使用XPath 1.0和下面的XML,如何选择所有具有“ b”父级的“ c”节点,如果“ b”父级不具有“ c”节点,则选择“”,即将{"c1", "", "c3"}作为结果节点集(按文档顺序)?

我正在使用VTD-XML 2.11(Java),并且正在寻找一个XPath评估,该评估将返回以上结果而不会循环。

<a>
  <b>
    <c>c1</c>
  </b>
  <b/>
  <b>
    <c>c3</c>
  </b>
</a>


我浏览了问题并找到了有趣的指针,例如奥利弗·贝克尔的方法,但是到目前为止,我还没有找到解决方案。

任何帮助,将不胜感激。

谢谢。

最佳答案

您使用什么来评估这些XPath?我想不出一个好方法,但是根据您使用的方式,可以很容易地选择所有b,对其进行迭代,然后为每个值使用c或空白值。

这不是一个很好的方法,但是适用于您的示例输入:

//b/c | //b[not(*)] | //b[not(c) and *]/text()


解释是:


选择c下的所有b
如果没有子元素,请自己选择任何b元素
选择任何没有b子级的c的第一个文本节点。


假设任何带有子元素的b都将至少具有一个文本节点,并且其中的第一个文本节点将完全是空白,这将起作用。

使用XSLT进行验证:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="/">
    <root>
      <xsl:for-each select="//b/c | //b[not(*)] | //b[not(c) and *]/text()[1]">
        <item>
          <xsl:value-of select="."/>
        </item>
      </xsl:for-each>
    </root>
  </xsl:template>
</xsl:stylesheet>


在示例输入上运行时的输出:

<root>
  <item>c1</item>
  <item></item>
  <item>c3</item>
</root>

关于xpath - XPath 1.0:选择具有给定父节点的所有子节点,如果父节点没有这样的子节点,则选择空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14710106/

相关文章:

python : Regular expressions in xpaths using Selenium

java - 如何使用 VTD-XML 获取 ONE 元素的所有命名空间声明?

java - concat() 函数在 VTD-XML 中与 AutoPilot 一起使用时 XPath 评估失败

c++ - vtd-xml c++编译安装报错

Python:Selenium xpath 查找具有不区分大小写字符的元素?

python - XPath Scrapy 结果问题 - OR 语句?

sql-server - 如何从 SQL Server 中的 XML 元素获取特定属性

java - 在新窗口中查找 xpath 位置,单击后打开。使用 java 和 selenium

java - 使用 VTD-XML 的带有 & 符号的 XML 文件的 ParserException

java - 解析 KML 文件时 VTD-XML 产生 "XML not terminated properly"错误