Как переименовать имена узловых элементов с помощью FLWOR XQuery? - PullRequest
1 голос
/ 18 июня 2020

Как я могу переименовать все теги foo как baz, используя XQuery, как показано ниже?

FLWOR:

declare namespace map = "http://www.w3.org/2005/xpath-functions/map";
declare namespace array = "http://www.w3.org/2005/xpath-functions/array";

declare namespace output = "http://www.w3.org/2010/xslt-xquery-serialization";

for $x in /root

return rename node $x/root/foo as "baz"

Пример c:

  <root>
    <foo>bar</foo>
  </root>

вывод Я ищу:

  <root>
    <baz>bar</baz>
  </root>

см. Также:

http://xqueryfiddle.liberty-development.net/nc4P6y8

и:

удаление элемента из xml с помощью saxon xquery

, который использует что-то не совсем непохожее ..

Ответы [ 2 ]

3 голосов
/ 18 июня 2020

Предполагая, что ваш настоящий документ более сложен, чем показанный, вносить небольшие изменения в большой документ обычно проще с помощью XSLT, чем XQuery. В XSLT 3.0 это

<xsl:stylesheet ...>
  <xsl:mode on-no-match="shallow-copy"/>
  <xsl:template match="foo">
    <baz><xsl:apply-templates/></baz>
  </xsl:template>
</xsl:stylesheet>

. В качестве альтернативы, если это единовременное требование, рассмотрите возможность использования утилиты Saxon Gizmo:

java net.sf.saxon.Gizmo -s:source.xml
/>rename //foo to "baz"
/>save out.xml
/>quit
2 голосов
/ 18 июня 2020

Вы должны иметь возможность использовать

for $foo in doc('input.xml')//foo
return rename node $foo as "baz"

, если у вас есть поддержка обновления XQuery (например, в Saxon 9 или 10 EE или в BaseX).

...