1

如何将所有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"

示例文档:

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

我正在寻找的输出:

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

也可以看看:

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

和:

使用 saxon xquery 从 xml 中删除元素

它使用了一些不完全不同的东西..

4

2 回答 2

3

你应该可以使用

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

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

于 2020-06-18T11:11:57.907 回答
3

假设您的真实文档比显示的更复杂,那么使用 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
于 2020-06-18T08:55:41.247 回答