如何用内联xmlns声明替换XML名称空间前缀?

西德尼

我有两个XML对象,我相信它们描述了同一实体,一个使用命名空间前缀,一个使用内联命名空间声明。我想对它们进行比较,但是表示名称空间的不同方式几乎不可能。

如何获取下面的第一个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>

区分它们的要求是手动调试过程的一部分,因此,我对Web工具,脚本或其他工具感到满意。我不打算定期执行此操作,但是我想弄清楚xml样本A与xml样本B有何不同。

zx485

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

<?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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

将对象序列化为XML时如何添加XML名称空间(xmlns)

解组具有xmlns名称空间的xml文档

是否添加了空的默认XML名称空间xmlns =“”属性?

开放图名称空间声明:带XMLNS或标头前缀的HTML?

默认声明哪些XML名称空间?

警告:此页面需要使用前缀XXX声明的XML名称空间http://xmlns.jcp.org/jsf/XXX,但该名称空间不存在标记库

如何在PHP中使用SimpleXMLElement生成以名称空间为前缀的xml元素

使用FOR XML EXPLICIT时删除xmlns =“”名称空间声明

如何用Rails中的%20替换空间

错误:未声明的名称空间前缀x:

如何在JavaScript + Marklogic中声明xml名称空间

在具有名称空间前缀的元素内创建不带名称空间前缀的XML元素

如何在PowerShell中将XML名称空间添加为属性前缀?

如何用前缀替换xmlns命名空间属性?

如何省略XML名称空间声明?

将XML名称空间前缀替换为完整的名称空间URI值?

创建XML内联xmlns

如何使用XSLT删除特定xml元素的名称空间前缀?

XML名称空间前缀冲突的XPath行为

如何使用XSLT替换XML中的前缀和命名空间

XSL如何从HTML输出中摆脱xmlns名称空间声明?

如何获取样式表中定义的名称空间前缀,而不是从输入XML中获取

如何使用Xstream从xml删除名称空间前缀?

如何通过前缀获取xml文件的名称空间(常规)

声明MathML的XML名称空间

如何在JAVA中编码默认名称空间和带有单个XML元素前缀的名称空间

如何在不带前缀的情况下使用某些XML名称空间标签?

在Eclipse的XHTML + XML文件中搜索并替换XML名称空间前缀

指定名称空间后,通过指针内联声明对象