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
实际上,你有三个选择:
//a | //div[not(a)]
,div
如果元素中没有元素,它将返回元素a
,并让你的Java代码处理任何div
返回为"无a
元素存在"的元素.根据上下文,这甚至可以允许您在需要时输出更有用的内容,因为您可以访问div的全部内容,例如错误' a
在div中找不到元素(某个标识符)'.a
在任何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.