【问题标题】:XPath to return a array of string concatenation of multiples child node valuesXPath 返回多个子节点值的字符串连接数组
【发布时间】:2015-06-21 10:23:58
【问题描述】:

如果我有以下 XML

<div>
    <p>1</p>
</div>
<div>
    <p>2</p> 3 
</div>
<div>
    <p>4</p> 5 <p>6</p>
</div>

如何指定 xpath 以返回如下字符串数组:

{ 1, 2, 46 }

我所做的所有尝试都返回了以下结果:

{ 1, 2, 4, 6}    

【问题讨论】:

    标签: xml xpath string-concatenation


    【解决方案1】:

    你来了

    concat(string-join(//div[count(p) = 1]/p, ',') , ',' , string-join(//div[count(p) &gt; 1]/string-join(p, ''), ','))
    

    将返回 1,2,46

    因为您需要在同一个 div 标签下连接一些 p 标签,所以在所有情况下,这将产生可以通过 tokenise() 函数转换为数组的字符串。

    这是诀窍:

    第一部分

    string-join(//div[count(p) = 1]/p, ',')
    

    这只会选择只有一个 p 标签的 div .. 所以这里不需要连接。这会得到

    1,2
    

    第二部分 string-join(//div[count(p) > 1]/string-join(p, ''), ',')

    这部分concat同一个div下的所有p标签,然后加入所有拥有多个p chid标签的dev。

    这部分会得到

    46
    

    示例:

    <div>
        <p>1</p>
    </div>
    <div>
        <p>2</p> 3 
    </div>
    <div>
        <p>4</p> 5 <p>6</p>
    </div>
    <div>1<p>2</p>3 , 1<p>2</p><p>3</p>4</div>
    

    输出将是

    1,2,46,223
    

    如果你想要它作为数组,你可以标记它。

    tokenize(concat(string-join(//div[count(p) = 1]/p, ',') , ',' , string-join(//div[count(p) &gt; 1]/string-join(p, ''), ',')) , ',')
    

    我希望这会有所帮助。

    如果我错了,请纠正我。

    【讨论】:

    • 对不起,不是很清楚,但我写的只是一个例子。我有数百个标签

      标签以多种形式出现,例如: 1

      2

      3 、 1

      2

      3

      4 等。 ..
    • 另外,当我说格式时,例如{1,2,3等}我是指数组自己的内容,而不是数组格式的字符串。注意:我正在使用 Python 中的 lxml。
    • 我解决了每个节点的“for”循环,但您的想法帮助我找到了这个解决方案。可能你也应该工作。谢谢!
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签