2016-12-30 61 views
0

我想從具有它的所有元素中刪除具有特定值的名稱空間。我找了它XSLT刪除XMLNS(名稱空間)與特定值匹配的屬性

XSLT轉換如下圖所示,我需要從包含它的元素刪除的xmlns = 「NS_647」

輸入XML

<COSR xmlns="TEST_NS1" > 
    <ORM_O01.PATIENT xmlns="NS_647" > 
     <PID> 
     <PID.1>1</PID.1> 
     </PID> 
    </ORM_O01.PATIENT> 
    </COSR> 

輸出

<COSR xmlns="TEST_NS1" > 
    <ORM_O01.PATIENT > 
     <PID> 
     <PID.1>1</PID.1> 
     </PID> 
    </ORM_O01.PATIENT> 
</COSR> 
+0

的[排除來自某個特定的XML元素使用XSLT屬性(可能的複製http://stackoverflow.com/questions/3116396/exclude-attribute-from-a- specific-xml-element-using-xslt) – Damian

+0

@Damian不,因爲「xmlns」不是屬性。 – Tomalak

+0

Rajendra,你能解釋一下爲什麼你想刪除命名空間嗎? – Tomalak

回答

3

XSLT在由XDM數據模型描述的節點樹上操作,而不是在原始詞法XML上操作。在輸入的XDM樹表示中,xmlns="NS_647"不作爲屬性節點存在。取而代之的是,命名空間聲明有兩個作用:

  1. 它改變它的範圍內的元素名稱的命名空間URI的一部分,和
  2. 它會導致在其範圍內的所有元素具有反映了結合的命名空間節點空的前綴到URI「NS_647」(順便說一句,相對URI作爲命名空間名稱已被棄用,但我們會通過)。

所以,你真的想在你的變身做的是改變相關的元素在命名空間"TEST_NS1"而不是"NS_647"。你可以做到這一點與模板規則:

<xsl:template match="*[namespace-uri()='NS_647']"> 
    <xsl:element name="{local-name(.)}" namespace="TEST_NS1"> 
    <xsl:apply-templates select="@* | node()"/> 
    </xsl:element> 
</xsl:template> 
+0

邁克爾的完整XML,樣式表不編譯。你能檢查嗎? –

+0

我修復了它。但是,如果您提供了錯誤消息和行號,它會更有幫助。 –

0

試試這個xslt

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 

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

</xsl:stylesheet> 
+0

我有其他的元素,我不想鬆散的其他名稱空間。 –

+0

所以,你可以編輯這個問題,並添加你有 – Damian