Xpath - 查找特定元素,打印该节点的所有元素

Xpath - Find specific element, print all elements of that node

给定元素的以下 Xpath

/std:Batch/BatchSection/ContractPartner/Contractor/Contract/contractNumber

如何打印出节点合约的所有子元素 其中 sequenceNumber= 12345?

我试过了

xmllint --xpath "string(/std:Batch/BatchSection/ContractPartner/Contractor/Contract/contractNumber[contractNumber='12345'])" test.xml

但是,这是一个无效的 XPath 表达式。如何解决?

示例输入:

<std:Batch xmlns:std="http://www.test.com/contractBatch" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <year>2020</year>
  <batchType>3</batchType>
  <runDate>2020-04-11</runDate>
  <text>Datatest</text>
  <jobInfo>Test</jobInfo>
  <BatchSection>
    <addedAtDate>2020-04-11</addedAtDate>
    <ContractPartner>
      <contractDealerAG>44444</contractDealerAG>
      <contractorType/>
      <isoCountry>NL</isoCountry>
      <language>EN</language>
      <Contractor>
        <contractor>44444</contractor>
        <Contract>
          <contractor>44444</contractor>
          <sequenceNumber>12345</sequenceNumber>
          <info1>abcd</info1>
        </Contract>
      </Contractor>
    </ContractPartner>
  </BatchSection>
</std:Batch>

期望的输出(其中 sequenceNumber=12345):

    <Contract>
      <contractor>44444</contractor>
      <sequenceNumber>12345</sequenceNumber>
      <info1>abcd</info1>
   </Contract>

我假设你指的是 sequenceNumber,按照 xml 的例子,如果是这样的话,那么你可能需要对 return 节点合约做这样的事情:

xmllint --xpath "//sequenceNumber[.="12345"]/.." test.xml

不幸的是,您必须处理可怕的名称空间...试试这样:

xmllint --xpath "//*[local-name()='Contract'] [.//*[local-name()='sequenceNumber'][./text()='12345']]" test.xml

看看它是否有效。