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

KJW*_*KJW 8 html java 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>
Run Code Online (Sandbox Code Playgroud)

//a会回来:

[a1,a3]
Run Code Online (Sandbox Code Playgroud)

上面的问题是第三列数据现在位于第二位,当未找到A时,它被完全跳过.

如何表达一个xpath来获取将返回的所有A元素:

[a1, null, a3]
Run Code Online (Sandbox Code Playgroud)

同样的情况//c,我想知道是否有可能获得

[null, null, c3]
Run Code Online (Sandbox Code Playgroud)

更新:考虑另一种没有共同父母的情况<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>
Run Code Online (Sandbox Code Playgroud)

更新:我现在也可以使用XSLT.

Fly*_*179 10

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的全部内容,例如错误' a在div中找不到元素(某个标识符)'.
  3. 使用XSLT预处理XML,该XSLT a在任何div尚未具有合适默认值的元素中插入元素.

你的第二个案例有点棘手,说实话,我实际上建议不要使用XPath,但它可以做到:

//a | //h1[not(following-sibling::a) or generate-id(.) != generate-id(following-sibling::a[1]/preceding-sibling::h1[1])]

这将匹配任何a元素,或者在下一个元素或文档末尾之前h1a存在后续元素的任何元素h1.正如Dimitre指出的那样,只有在XSLT中使用它时才有效,就像generate-idXSLT函数一样.

如果你没有在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.