使用xPath映射同级节点

时间:2019-12-11 21:10:56

标签: xml xpath

我需要一种解析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节点。

2 个答案:

答案 0 :(得分:0)

您可以使用以下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

答案 1 :(得分:0)

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

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

它的作用是将RecordHeader的所有同级兄弟的Product_ID附加到其先前的同级兄弟RecordHeader的{​​{1}}。