簡體   English   中英

如何用內聯 xmlns 聲明替換 XML 命名空間前綴?

[英]How can I replace XML namespace prefixes with inline xmlns declarations?

我有兩個 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 有何不同。

您可以使用以下 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM