在 shell 中的 XML 文档的默认名称 space 的标签中添加名称space 前缀

Add a namespace prefix to the tags of the default name space of an XML document from the shell

我有一个 SVG 文件,它是一个 XML 文档:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
   xmlns:svg="http://www.w3.org/2000/svg"
   xmlns="http://www.w3.org/2000/svg"
   xmlns:xlink="http://www.w3.org/1999/xlink"
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape">
  <defs
     id="defs2">
  <!-- a lot of stuff --> </defs>
  <!-- more stuff like -->
  <metadata
     id="metadata5">
    <rdf:RDF>
      <cc:Work
         rdf:about="">
        <dc:format>image/svg+xml</dc:format>
        <dc:type
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
        <dc:title />
      </cc:Work>
    </rdf:RDF>
  </metadata>
  <!-- etc... -->
</svg>

我想将 svg: 前缀添加到与默认命名空间对应的所有标签,以便获得下一个输出:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg:svg
   xmlns:svg="http://www.w3.org/2000/svg"
   xmlns:xlink="http://www.w3.org/1999/xlink"
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape">
  <svg:defs
     id="defs2">
  <!-- a lot of stuff--> </svg:defs>
  <!-- more stuff like -->
  <svg:metadata
     id="metadata5">
    <rdf:RDF>
      <cc:Work
         rdf:about="">
        <dc:format>image/svg+xml</dc:format>
        <dc:type
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
        <dc:title />
      </cc:Work>
    </rdf:RDF>
  </svg:metadata>
  <!-- etc... -->
</svg:svg>

我确信这可以在 shell 的一个或几个命令行中使用 xmllint and/or xmlstarlet 但我无法管理它。

您准备好试用 Saxon 10.0 中的新 Gizmo 工具了吗?如果是:

使用如下命令调用 Gizmo:

java -cp saxon-he-10.0.jar:jline-2.9.jar net.sf.saxon.Gizmo

然后输入子命令

load x/y/z/input.xml
namespace svg http://www.w3.org/2000/svg
rename /*:svg as "svg:svg"
save x/y/z/output.xml
quit

文档位于 http://www.saxonica.com/documentation/index.html#!gizmo

请注意,这是一款非常新的软件(仅在周一首次发布),因此您处于最前沿...