我需要创建一个XPath来获取元素LMS/LMS.1/LMS.1.1
的值,但有时子元素LMS.1.1
不存在,文本位于父元素LMS.1
中。
输入案例1:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<LMS>
<LMS.1>
<LMS.1.1>content1</LMS.1.1>
<LMS.1.2>shouldNotBeSelected</LMS.1.2>
</LMS.1>
</LMS>
</root>
输入案例2:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<LMS>
<LMS.1>content2</LMS.1>
<LMS.2>shouldNotBeSelected</LMS.2>
</LMS>
</root>
我应该如何创建它是通用的XPath,并且可以使用一个XPath处理这两种情况?
即。 //LMS.1/text()
确实仅返回return content2
或其他方法:如果给定的叶元素不存在,则选择父文本:// LMS.1 /LMS1.1也会返回content1。
答案 0 :(得分:0)
您可以通过请求其最顶层节点的string-value
来获取整个子树的文本内容 - 在这种情况下可能是<LMS.1>
元素。但是,这也将包括空格,即我猜猜你会想要脱光。
所以:normalize-space(/root/LMS/LMS.1)
应该接近你正在寻找的东西。
答案 1 :(得分:0)
此表达式
//LMS/descendant::*[not(*)]/text()
选择任何LMS子树的叶节点的文本节点
答案 2 :(得分:0)
以下代码对您有所帮助吗?
concat(//LMS.1/LMS.1.1/text(), //LMS.1/text())
答案 3 :(得分:0)
使用以下select包含或操作数:
//LMS.1/LMS.1.1|//LMS.1[not(*)]
但它不是很漂亮,但到目前为止工作。还有其他解决方案吗?