XPath选择父元素或子元素

时间:2014-02-05 07:01:59

标签: xml xpath

我需要创建一个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。

4 个答案:

答案 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(*)]

但它不是很漂亮,但到目前为止工作。还有其他解决方案吗?