![](/img/trans.png)
[英]How can I remove namespace prefixes in xml without removing the xmlns tag?
[英]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.