如何使用 FLWOR XQuery 重命名节点元素名称?

How to rename node element names using a FLWOR XQuery?

如何使用如下所示的 XQuery 将所有 foo 标签重命名为 baz

佛罗里达州:

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"

示例文档:

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

我正在寻找的输出:

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

另见:

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

和:

removing an element from xml using saxon xquery

它使用的东西并非完全不同..

假设您的真实文档比显示的文档更复杂,使用 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

你应该可以使用

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

假设您支持 XQuery 更新(例如在 Saxon 9 或 10 EE 或 BaseX 中)。