给定以下符合 XML 的 HTML:
<div>
<a>a1</a>
<b>b1</b>
</div>
<div>
<b>b2</b>
</div>
<div>
<a>a3</a>
<b>b3</b>
<c>c3</c>
</div>
正在做 //a
将返回:
[a1,a3]
上面的问题是第三列数据现在排在第二位,当找不到 A 时,它会被完全跳过。
如何表达一个 xpath 来获取所有将返回的 A 元素:
[a1, null, a3]
//c
的情况相同, 请问有没有可能得到
[null, null, c3]
更新:考虑另一种没有共同 parent 的情况<div>
.
<h1>heading1</h1>
<a>a1</a>
<b>b1</b>
<h1>heading2</h1>
<b>b2</b>
<h1>heading3</h1>
<a>a3</a>
<b>b3</b>
<c>c3</c>
更新:我现在也可以使用 XSLT。
最佳答案
XPath 中没有空值。这里有一个半相关的问题也解释了这一点:http://www.velocityreviews.com/forums/t686805-xpath-query-to-return-null-values.html
实际上,您有三个选择:
- 根本不要使用 XPath。
- 使用这个:
//a | //div[not(a)]
,这将返回div
如果没有元素a
在其中,并让您的 Java 代码处理任何div
返回为“否a
”元素存在'。根据上下文,这甚至可以让您在需要时输出更有用的内容,因为您可以访问 div 的全部内容,例如错误 'noa
在 div 中找到的元素(某些标识符)'。 - 使用插入
a
的 XSLT 预处理您的 XML任何div
中的元素尚无合适默认值的元素。
你的第二种情况有点棘手,老实说,我实际上建议根本不要使用 XPath,但它可以做到:
//a | //h1[not(following-sibling::a) or generate-id(.) != generate-id(following-sibling::a[1]/preceding-sibling::h1[1])]
这将匹配任何 a
元素,或任何 h1
没有以下元素 a
元素存在于下一个 h1
之前元素,或文档的结尾。正如 Dimitre 指出的那样,这仅在您从 XSLT 中使用它时才有效,如 generate-id
是一个 XSLT 函数。
如果您不在 XLST 中使用它,您可以使用这个相当人为的公式:
//a | //h1[not(following-sibling::a) or count(. | preceding-sibling::h1) != count(following-sibling::a[1]/preceding-sibling::h1)]
它通过匹配 h1
来工作元素本身和所有前面的计数 h1
元素与所有 h1
的计数不同下一个 a
之前的元素.在 XPath 中可能有更有效的方法,但如果它会变得比这更人为,我绝对建议根本不要使用 XPath。
关于java - 如何在 XSLT 中使用 XPath 获取元素数组,包括缺失的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9648790/