XPath удаляет один узел (через Saxon CLI) - PullRequest
0 голосов
/ 28 августа 2018

Я хочу удалить узел из файла XML (используя SaxonHE9-8-0-11J):

<project name="Build">
  <property name="src" value="src/main/resources" />
  <property name="target" value="target/classes" />

  <condition property="target.exists">
    <available file="target" />
  </condition>
</project>

Очевидно, есть 2 способа, которыми я могу сделать это . XPath1: использование не функции XPath2: использование условия исключения. Но оба просто возвращают весь набор узлов.

Без функции:

saxonb-xquery -s:test.xml -qs:'*[not(local-name()="condition")]'

С исключающим предложением:

saxonb-xquery -s:test.xml -qs:'* except condition'

С ключом -explain запросы:

<query>
  <body>
    <filterExpression>
      <axis name="child" nodeTest="element()"/>
      <operator op="ne (on empty return true())">
        <functionCall name="local-name">
          <dot/>
        </functionCall>
        <literal value="condition" type="xs:string"/>
      </operator>
    </filterExpression>
  </body>
</query>

и

<query>
  <body>
    <operator op="except">
      <axis name="child" nodeTest="element()"/>
      <path>
        <root/>
        <axis name="descendant" nodeTest="element(condition, xs:anyType)"/>
      </path>
    </operator>
  </body>
</query>

1 Ответ

0 голосов
/ 28 августа 2018

В общем, XPath выбирает узлы из одного или нескольких входных документов, он не позволяет создавать новые, для этого вам нужен XSLT или XQuery. А удаление дочернего элемента condition корня project, если это то, чего вы хотите достичь, - это то, что вам нужно для XSLT или XQuery, для XPath, даже если вы используете /*/(* except condition), вы получите все дочерние элементы, кроме condition элемент, но как последовательность, не обернутая в корень.

Так что с XQuery вы можете использовать

/*/element {node-name()} { * except condition }

как компактный, но общий способ восстановления любого корня со всеми дочерними элементами, кроме condition: https://xqueryfiddle.liberty -development.net / 948Fn5b

Получаете ли вы такое выражение через оболочку командной строки, это другая проблема, в Windows с окном Powershell и оболочкой cmd мне подходит

-qs:"/*/element {node-name()} { * except condition }"
...