使用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/