java - 如何在 XSLT 中使用 XPath 获取元素数组,包括缺失的元素?

标签 java html xml xslt xpath

给定以下符合 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

实际上,您有三个选择:

  1. 根本不要使用 XPath。
  2. 使用这个://a | //div[not(a)] ,这将返回 div如果没有元素 a在其中,并让您的 Java 代码处理任何 div返回为“否 a”元素存在'。根据上下文,这甚至可以让您在需要时输出更有用的内容,因为您可以访问 div 的全部内容,例如错误 'no a在 div 中找到的元素(某些标识符)'。
  3. 使用插入 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/

相关文章:

java - 使用 Java 在私有(private)模式下运行 Selenium EdgeDriver(Chromium)

xml - 创建 XML 节点

java - 使用 Spring AOP 清理记录器

java - 比较antlr生成的 token

javascript - 多页、动态内容 JS

html - 当鼠标悬停在 css3 上时,如何使一个图像出现在另一个图像之上?

html - 创建无限平行模式

xml - 在 Erlang 中构建 XMERL 文档

java - getElementsByTagName - 失败不一致

java - 两个类来扩展一项 Activity ?