2017-01-15 30 views
0

我有一個XML文檔(由WiX熱生成),我想在刪除屬性時刪除根元素名稱。源樹是這個樣子重命名標記並刪除屬性

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> 
    <Fragment> 
     <DirectoryRef Id="HELP" /> 
    </Fragment> 
</Wix> 

我想出如何重新命名節點,但這並不刪除不必要的屬性xmlns

<xsl:template match='/wix:Wix'> 
    <Include> 
     <xsl:copy-of select="@*|node()"/> 
    </Include> 
    </xsl:template> 

    <!-- Even this template doesn't suppress the attribute xmlns --> 
    <xsl:template match='@xmlns'/> 

I事件從select子句中刪除了@*|。但是這沒有任何影響。

如何使用XSLT 1.0生成以下所需輸出?

<Include> 
    <Fragment> 
     <DirectoryRef Id="HELP" /> 
    </Fragment> 
</Include> 

回答

1

這並不刪除不必要的屬性xmlns

xmlns不是屬性 - 這是一個命名空間,節點的名稱的一部分。如果你不希望它在輸出中,你不能複製在一個命名空間中的輸入節點 - 而是必須創建新的節點,例如:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:wix="http://schemas.microsoft.com/wix/2006/wi" 
exclude-result-prefixes="wix"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="/wix:Wix"> 
    <Include> 
     <xsl:apply-templates/> 
    </Include> 
</xsl:template> 

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

</xsl:stylesheet> 
+0

好吧,這作品。但我想知道爲什麼。我沒有在我的XSLT書中找到這個{}。那裏發生了什麼?我假設''實際上刪除了選擇模式中定義的內容。但爲什麼這會使用屬性模式'@ *'?爲什麼這會影響帶有名稱空間(不是屬性)添加的標籤? – harper

+0

關於'{}'搜索*屬性值模板*。至於'xsl:copy-of select =「@ *」/>',您的假設是錯誤的 - 指令只是複製當前處理元素的所有屬性。我們在這裏假設你的實際屬性都不在名稱空間中,所以這些*可以被複制。請注意,與元素不同,屬性不會繼承其父節點的名稱空間。 –