2011-08-11 71 views
3

我有一個XML文件,它具有默認名稱空間和空名稱空間,這些名稱空間需要被刪除,同時保留名稱空間的其餘部分。如何刪除默認名稱空間並使用XSLT保留其餘的名稱空間?

輸入:

<prefix:request xmlns:prefix="urn1" xmlns:foo2="urn2" xmlns="urn1"> 
<element1 xmlns="">version1</element1> 
<element2 xsi:type="prefix:requestA" xmlns=""/> 
... 
</element1> 
</prefix:request> 

預期輸出:用於去除命名空間將過濾掉所有名稱空間,包括前綴

<prefix:request xmlns:prefix="urn1" xmlns:foo2="urn2"> 
<element1>version1</element1> 
<element2 xsi:type="prefix:requestA"/> 
... 
</element1> 
</prefix:request> 

XSLT樣品。任何想法如何解決這個特殊情況?

+0

良好問題,+1。看到我的答案爲非常短(迄今最短)和簡單的解決方案:) –

回答

0

這短短的轉變應用:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="*"> 
    <xsl:element name="{name()}" namespace="{namespace-uri()}"> 
     <xsl:copy-of select="@*|namespace::*[name()]"/> 
     <xsl:apply-templates select="node()"/> 
    </xsl:element> 
</xsl:template> 
</xsl:stylesheet> 

當所施加的(嚴重畸形和具有要被校正)提供類似於XML的輸入

<prefix:request xmlns:xsi="Undefined !!!" 
xmlns:prefix="urn1" xmlns:foo2="urn2" 
xmlns="urn1"> 
    <element1 xmlns="">version1</element1> 
    <element2 xsi:type="prefix:requestA" xmlns=""/> ... 
</prefix:request> 

產生想要的,正確的結果

<prefix:request xmlns:prefix="urn1" xmlns:xsi="Undefined !!!" xmlns:foo2="urn2"> 
    <element1>version1</element1> 
    <element2 xsi:type="prefix:requestA"/> ... 
</prefix:request> 
+0

@sari:你的意思是你在你的問題中提供的XML文檔上應用我的轉換時遇到這個錯誤?如果是這樣,這意味着您正在使用有缺陷的工具,不符合要求的工具。最好的辦法是停止使用它。有幾個很好的XSLT開發人員工具和XSLT處理器。在Java世界中,人們使用撒克遜。許多開發人員使用oXygen作爲他們的XSLT IDE。 –

+0

謝謝。到目前爲止,所提供的轉換在Jdeveloper XSLT工具中不起作用;(。生成了一個錯誤「XML-23049:FOTY0021:invalid node type」。我嘗試了更簡單的腳本,就像從XML輸入中移除所有命名空間一樣。 ,沒有錯誤,但在輸出的根元素中有一個空的名稱空間,就像這個xmlns =「」。這也是不想要的結果。 – sari

+0

這是正確的,我也得到了「無效節點類型」的錯誤也爲這篇文章的第一個答案。感謝您的建議,似乎我現在必須轉移到另一個工具,在修復時會在這裏發佈 – sari

1

那麼您發佈的代碼片段甚至不是格式良好的XML,因此很難說明您想要實現什麼,因爲第二個結束</element1>沒有任何相應的開始標記,並且前綴xsi已被使用但從未宣佈。

但是假設你有

<prefix:request xmlns:prefix="urn1" xmlns:foo2="urn2" xmlns="urn1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<element1 xmlns="">version1</element1> 
<element2 xsi:type="prefix:requestA" xmlns=""/> 

</prefix:request> 

那麼樣式表

<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 

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

    <xsl:template match="@* | text() | comment() | processing-instruction()"> 
    <xsl:copy/> 
    </xsl:template> 

</xsl:stylesheet> 

當撒克遜6.5.5將輸出

<?xml version="1.0" encoding="utf-8"?><prefix:request xmlns:prefix="urn1" xmlns:foo2="urn2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<element1>version1</element1> 
<element2 xsi:type="prefix:requestA"/> 

</prefix:request> 
+0

是的,你的假設是正確的,謝謝!現在,當在JDeveloper中介XSLT 1.0中測試您的腳本時,我得到錯誤。它表示定義的XSL與有效載荷不匹配,或者有效載荷無效;那麼它說無效的節點類型。但是,所討論的有效載荷完全可以通過XSLT腳本進行轉換,以移除所有命名空間。這裏有什麼可能是錯的? – sari

+0

對不起,我不知道JDeveloper調解器,所以我無法幫助解釋它的錯誤消息。 –

相關問題