您使用什么来评估这些 XPath?我想不出一个很好的方法,但是根据您使用的内容,选择所有b
s,遍历它们,并为每个使用 c 的值或空白值可能很容易。
这不是一个好方法,但它适用于您的示例输入:
//b/c | //b[not(*)] | //b[not(c) and *]/text()
解释是:
- 选择
c
a下的所有sb
b
如果元素没有子元素,则选择它们本身
b
选择任何没有c
子节点的 s 的第一个文本节点。
假设任何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>