2014-03-19 132 views
1

我試圖從轉換的XML刪除空間中聲明空間聲明的問題

請到這裏:http://xslttest.appspot.com/

輸入XML:

<Products xmlns="http://api.company.com.au/Data" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
<Product> 
<Code>BM54</Code> 
</Product> 
</Products> 

XSLT模板

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:d="http://api.company.com.au/Data" exclude-result-prefixes="d"> 
    <xsl:output method="xml" omit-xml-declaration="yes"/> 
    <xsl:template match="@* | node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | node()"/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="d:Product"> 
     <DONE> 
      <xsl:apply-templates select="@* | node()"/> 
     </DONE> 
    </xsl:template> 
    <xsl:template match="@Product"> 
     <xsl:attribute name="DONE"> 
      <xsl:value-of select="."/> 
     </xsl:attribute> 
    </xsl:template> 
</xsl:stylesheet> 

結果是:

<Products xmlns="http://api.company.com.au/Data" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<DONE xmlns=""> 
<Code xmlns="http://api.company.com.au/Data">BM54</Code> 
</DONE> 
</Products> 

我希望它是:

<Products xmlns="http://api.company.com.au/Data" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<DONE> 
<Code>BM54</Code> 
</DONE> 
</Products> 

回答

2

只是改變

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

<xsl:template match="d:Product"> 
    <xsl:element name="DONE" namespace="http://api.company.com.au/Data"> 
     <xsl:apply-templates select="@* | node()"/> 
    </xsl:element> 
</xsl:template> 
+3

請注意,這並不是「刪除名稱空間」 - 實際上,您將「DONE」元素放入正確的名稱空間中,以便從父級繼承默認名稱空間。它所做的是避免取消繼承的默認值。這是樣本輸出中要求的內容,但不是原始海報認爲他們要求的內容。 – keshlam

+0

如果您在帖子的底部閱讀,OP會列出他的要求。可能是OP想說「我試圖從轉換後的xml中的一些節點中刪除不需要的名稱空間聲明」。 –

+0

非常感謝這麼多:) – Paul

1

的alterate解決方案,如果你想創建的元素到默認的命名空間是申報前期:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:d="http://api.example.com.au/Data" 
    xmlns="http://api.example.com.au/Data" 
    exclude-result-prefixes="d"> 
<!-- rest of the document --> 

這使得d速記和空命名空間都對應於http://api.company.com.au/Data這就是你打算,即使它是不是你問什麼。

然後你可以使用原始代碼:

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

由於keshlam指出,這個工程監守你把它變成了相同的命名空間文檔的其餘部分。