Select 使用 XPATH 1.0 和包含特定文本的 xmlstarlet 的节点
Select node using XPATH 1.0 and xmlstarlet containing specific text
从下面的 XML 开始为:
<?xml version="1.0" encoding="UTF-8"?><searchRetrieveResponse>
<version>1.2</version>
<numberOfRecords>1</numberOfRecords>
<records>
<record>
<recordSchema>marcxml</recordSchema>
<recordPacking>xml</recordPacking>
<recordData>
<record>
<leader>01448cam a2200445Ia 4500</leader>
<controlfield tag="001">9910650701858</controlfield>
<controlfield tag="005">20181227054218.2</controlfield>
<controlfield tag="008">930525s1941 nyu b 001 0 eng d</controlfield>
<datafield tag="035" ind1=" " ind2=" ">
<subfield code="a">(OCoLC)28157672</subfield>
</datafield>
<datafield tag="035" ind1=" " ind2=" ">
<subfield code="a">(OCoLC)ocm28157672</subfield>
</datafield>
<datafield tag="035" ind1=" " ind2=" ">
<subfield code="a">(EXLNZ-01ALLIANCE_NETWORK)99153881770001451</subfield>
</datafield>
<datafield tag="040" ind1=" " ind2=" ">
<subfield code="a">UTS</subfield>
<subfield code="b">eng</subfield>
<subfield code="c">UTS</subfield>
我只需要 select /searchRetrieveResponse/records/record/recordData/record/datafield[@tag="035"]/subfield[@code="a"]
中包含 (EXLNZ-01ALLIANCE_NETWORK
) 的文本节点,使用 xmlstarlet (XPATH 1.0),所以理想的输出是 (EXLNZ-01ALLIANCE_NETWORK)99153881770001451
我尝试了 xmlstarlet sel -T -t -m '/searchRetrieveResponse/records/record/recordData/record/datafield[@tag="035"]/subfield[@code="a"][text()[contains(.,'ALLIANCE_NETWORK')]]' -v '.'
的多种变体,但我一直返回所有 035/subfield[@code="a"] 而不是我想要的那个。我究竟做错了什么?谢谢
搞清楚了 -- 包含过滤器设置不正确。我发帖只是因为我发现匹配节点很尴尬。
xmlstarlet sel -T -t -m '/searchRetrieveResponse/records/record/recordData/record/datafield[@tag="035"]/subfield[@code="a"][contains(text(), "ALLIANCE_NETWORK")]' -v '.'
从下面的 XML 开始为:
<?xml version="1.0" encoding="UTF-8"?><searchRetrieveResponse>
<version>1.2</version>
<numberOfRecords>1</numberOfRecords>
<records>
<record>
<recordSchema>marcxml</recordSchema>
<recordPacking>xml</recordPacking>
<recordData>
<record>
<leader>01448cam a2200445Ia 4500</leader>
<controlfield tag="001">9910650701858</controlfield>
<controlfield tag="005">20181227054218.2</controlfield>
<controlfield tag="008">930525s1941 nyu b 001 0 eng d</controlfield>
<datafield tag="035" ind1=" " ind2=" ">
<subfield code="a">(OCoLC)28157672</subfield>
</datafield>
<datafield tag="035" ind1=" " ind2=" ">
<subfield code="a">(OCoLC)ocm28157672</subfield>
</datafield>
<datafield tag="035" ind1=" " ind2=" ">
<subfield code="a">(EXLNZ-01ALLIANCE_NETWORK)99153881770001451</subfield>
</datafield>
<datafield tag="040" ind1=" " ind2=" ">
<subfield code="a">UTS</subfield>
<subfield code="b">eng</subfield>
<subfield code="c">UTS</subfield>
我只需要 select /searchRetrieveResponse/records/record/recordData/record/datafield[@tag="035"]/subfield[@code="a"]
中包含 (EXLNZ-01ALLIANCE_NETWORK
) 的文本节点,使用 xmlstarlet (XPATH 1.0),所以理想的输出是 (EXLNZ-01ALLIANCE_NETWORK)99153881770001451
我尝试了 xmlstarlet sel -T -t -m '/searchRetrieveResponse/records/record/recordData/record/datafield[@tag="035"]/subfield[@code="a"][text()[contains(.,'ALLIANCE_NETWORK')]]' -v '.'
的多种变体,但我一直返回所有 035/subfield[@code="a"] 而不是我想要的那个。我究竟做错了什么?谢谢
搞清楚了 -- 包含过滤器设置不正确。我发帖只是因为我发现匹配节点很尴尬。
xmlstarlet sel -T -t -m '/searchRetrieveResponse/records/record/recordData/record/datafield[@tag="035"]/subfield[@code="a"][contains(text(), "ALLIANCE_NETWORK")]' -v '.'