2012-09-19 44 views
0

在XML文件中刪除attribut的一部分的節點我有以下XML代碼:如何使用XSLT

<OML>  
    <bg-def xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="EX1"/> 
</OML> 

我想刪除屬性的xmlns:XSI和使用XSLT它的價值,所以該結果將是這樣的:

<OML>  
    <bg-def name="EX1"/> 
</OML> 

我tryied用下面的XSLT代碼做到這一點:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" 
xmlns:ex="http://exslt.org/dates-and-times" extension-element-prefixes="ex"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="no" xml:space="preserve"/> 

<xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 
<xsl:template match="bg-def|@ xmlns:xsi"/> 
</xsl:transform> 

編寫我的代碼之前,我的編輯警告我: 「W名稱空間前綴xmlns尚未被聲明爲」。 當我刪除表達式:xsi並且只寫xmlns,沒有任何警告更多。但是,當我編譯和執行我的程序時,什麼也沒有發生,我沒有得到預期的輸出。 我試着也改變我的XSLT文件與此的最後一行:

<xsl:template match="bg-def|@ name"/> 

然後將結果看起來像這樣:

<OML>  
    <bg-def xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/> 
</OML> 

這意味着,屬性一直很移除好。但是我想用屬性xmlns:xsi來做到這一點。 有人可以幫我做這個嗎? 感謝您的幫助。爲BD-DEF節點 永邦

回答

0

使用下面的模板:

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

相反

<xsl:template match="bg-def|@ name"/> 

此模板的

將創建節點BG-DEF,並複製它的上下文節點和屬性,但沒有命名空間

查看類似的問題: remove namespace for a perticular element

更新:

源文件:

<OML>  
    <bg-def xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="EX1"/> 
</OML> 

樣式表:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" 
    xmlns:ex="http://exslt.org/dates-and-times" extension-element-prefixes="ex"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="no" xml:space="preserve"/> 

    <xsl:template match="node()|@*"> 
     <xsl:copy> 
      <xsl:apply-templates select="node()|@*"/> 
     </xsl:copy> 
    </xsl:template> 

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

</xsl:transform> 

變換結果(撒克遜6.5.5 - XSLT 1.0):

<?xml version="1.0" encoding="UTF-8"?><OML>  
    <bg-def name="EX1"/> 
</OML> 
+0

@ Vitaliy,謝謝你的幫助,但答案並沒有達到我想要的。我不知道如果我的問題是不明確的,但我需要的是這樣的輸出: ' ' ,你給我的解決方案,爲我提供這個 ' EX1 '。謝謝 –

+0

現在一切正常Vitaliy。我遵循你給我的鏈接,我說我必須在我的XSLT文件的頂部添加** xmlns:xsi =「http://www.w3.org/2001/XMLSchema-instance」**。再次感謝。 –

+0

@Franky N - 非常有趣的是,我的例子給了你不正確的結果 - 我試着用撒克遜處理器,它給了我: Vitaliy

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

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

</xsl:stylesheet>