xml - 如何使用内联 xmlns 声明替换 XML 命名空间前缀?

标签 xml diff xml-namespaces

我有两个 XML 对象,我认为它们描述了同一实体,一个使用命名空间前缀,另一个使用内联命名空间声明。我想区分它们,但是表示 namespace 的不同方式使得这几乎不可能。

如何获取下面的第一个 xml 片段并将其更改为匹配第二个片段?

<!--I want to take data that looks like this-->
<Foo xmlns:e="http://schemas.cch.com/FooBar/MDS/2007/12/04/Foo">
  <e:Description></e:Description>
  <e:Name i:nil="true"></e:Name>
  <e:DisplaySeqNo>0</e:DisplaySeqNo>
</Foo>

<!--I want to make that data that looks like this-->
<Foo>
  <Description xmlns="http://schemas.cch.com/FooBar/MDS/2007/12/04/Foo"></Description>
  <Name i:nil="true" xmlns="http://schemas.cch.com/FooBar/MDS/2007/12/04/Foo"></Name>
  <DisplaySeqNo xmlns="http://schemas.cch.com/FooBar/MDS/2007/12/04/Foo">0</DisplaySeqNo>
</Foo>

区分它们的要求是手动调试过程的一部分,所以我很乐意使用网络工具、脚本或其他东西。我不打算定期这样做,但我正在抓紧时间试图弄清楚 xml 示例 A 与 xml 示例 B 有何不同。

最佳答案

您可以使用以下 XSLT-1.0 样式表。它是身份模板(复制所有节点)与两个处理替换情况的模板的组合:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:e="http://schemas.cch.com/FooBar/MDS/2007/12/04/Foo">
    <xsl:output method="xml" indent="yes"/>

    <!-- Identity template -->
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="Foo">
      <xsl:element name="{local-name()}" namespace="">
        <xsl:apply-templates select="node()|@*" />
      </xsl:element>
    </xsl:template>

    <xsl:template match="e:*">
      <xsl:element name="{local-name()}" namespace="http://schemas.cch.com/FooBar/MDS/2007/12/04/Foo">
        <xsl:apply-templates select="node()|@*" />
      </xsl:element>
    </xsl:template>    

</xsl:stylesheet>

它的输出是:

<Foo>
  <Description xmlns="http://schemas.cch.com/FooBar/MDS/2007/12/04/Foo"/>
  <Name xmlns="http://schemas.cch.com/FooBar/MDS/2007/12/04/Foo" i:nil="true"/>
  <DisplaySeqNo xmlns="http://schemas.cch.com/FooBar/MDS/2007/12/04/Foo">0</DisplaySeqNo>
</Foo>

它还会对 XML 文件产生错误,因为其中未定义 i 命名空间。它还从输入 XML 复制注释,但我猜这只是用于说明的注释,因此可以忽略。

如果您使用某种 Linux,您可以轻松地将此模板传递给 xsltproc

关于xml - 如何使用内联 xmlns 声明替换 XML 命名空间前缀?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60104081/

相关文章:

php - 使用 PHP 将 XML 发布到 URL 并处理响应

xml - 使用/包含来自另一个节点的值

textarea - 比较两个不同 CodeMirror textarea 的变化

java - intelliJ IDEA 中的自定义 spring 命名空间处理程序

c# - XML 到列表转换器? XML 是正确的工具吗?

ocaml - 自动为递归数据结构生成差异 pp

algorithm - 查找几乎重复的二进制文件(.lib、.bin)

c# - 命名空间中的 URL 引用,它们是如何工作的?

xml - 如何使用冒号解码 xml 元素

xml - 如何使用 Java API 在 Marklogic 中搜索 XML 标签或 JSON 键