【问题标题】:Mapping sibling nodes using xPath使用 xPath 映射兄弟节点
【发布时间】:2019-12-11 21:10:56
【问题描述】:

我需要一种方法来解析 XML 文件并将某些节点与其兄弟节点链接起来。例如,在这个 XML(不是我的实际数据,只是一个示例)中,我试图将所有 RecordDetail 节点与前面的 RecordHeader 链接。

XML:

<RecordSet>
    <RecordHeader>
        <Record_ID>HE7</Record_ID>
        <DetailRecords>2</DetailRecords>
    </RecordHeader>
    <RecordDetail>
        <Product_ID>1-1X00</Product_ID>
        <Quantity>5</Quantity>
    </RecordDetail>
    <RecordDetail>
        <Product_ID>1-3788</Product_ID>
        <Quantity>1</Quantity>
    </RecordDetail>
</RecordSet>

预期输出:

Product_ID   Record_ID
----------------------
1-1X00       HE7
1-3788       HE7

我可以用下面的表达式得到兄弟节点,但它只列出一次:

//RecordDetail/preceding-sibling::RecordHeader/Record_ID/node()

有没有办法列出每个 RecordDetail 节点,并附上它之前的RecordHeader 节点?

总会有一个记录头,后面跟着任意数量的 RecordDetail 节点。

【问题讨论】:

    标签: xml xpath


    【解决方案1】:

    您可以使用以下 XPath-2.0 表达式创建不带标题的输出:

    for $i in //RecordDetail return concat($i/Product_ID/text(),'&#09;&#09;',$i/preceding-sibling::RecordHeader[1]/Record_ID,'&#xa;')
    

    它的输出是

    1-1X00         HE7
    1-3788         HE7
    

    【讨论】:

      【解决方案2】:

      对于 XPath 1.0,您可以使用以下 xpath:

      //RecordHeader/following-sibling::RecordDetail/concat(concat(Product_ID/text(), ' '), preceding-sibling::RecordHeader/Record_ID/text())

      它的作用是获取RecordHeader 的所有兄弟姐妹,获取他们的Product_ID,并将其附加到其前面的兄弟姐妹RecordHeaderRecord_ID

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多