2011-04-01 72 views
0

說我有看起來像這樣的XML文件:如何使用默認命名空間編寫XSL?

<?xml version="1.0" encoding="UTF-8"?> 

<Project xmlns="http://My/Project.xsd"> 
    <Thing Name="test"/> 
</Project> 

我的XSLT是:

<?xml version="1.0" encoding="UTF-8"?> 

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:xdt="http://www.w3.org/2005/xpath-datatypes" xmlns="http://My/Project.xsd"> 
    <xsl:output method="text" version="1.0" encoding="UTF-8" indent="no"/> 

    <xsl:template match="Thing"> 
     <xsl:value-of select="@Name"/> 
    </xsl:template> 
</xsl:stylesheet> 

輸出是[NewLine][Tab][NewLine]該XML文件的間距相匹配。

如果我改變我的XSLT是:(加前綴)

<?xml version="1.0" encoding="UTF-8"?> 

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:xdt="http://www.w3.org/2005/xpath-datatypes" xmlns:N="http://My/Project.xsd"> 
    <xsl:output method="text" version="1.0" encoding="UTF-8" indent="no"/> 

    <xsl:template match="N:Thing"> 
     <xsl:value-of select="@Name"/> 
    </xsl:template> 
</xsl:stylesheet> 

輸出爲[NewLine][Tab]test[NewLine]這又符合XML文件的間隔,但包括「名稱」屬性的值。

我的預期產出只是test。沒有新行,沒有標籤 - 它不應該遵循XML文件的格式。

我想在不使用前綴的情況下編寫XML和XSLT。我如何使這個輸出成爲我期待的?

回答

3

這裏有兩個問題 - 第一個是你不想指定命名空間前綴,第二個是你不想讓源文檔中的空格影響你的輸出。我們分別討論它們。

使用命名空間前綴: 簡短的答案是否定的 - 你不能寫符合特定命名空間內的元素,而無需指定使用前綴,命名空間XSL模板。在你的第一個XSLT,你可以讀出的模板定義,就像「我想選擇稱爲Thing節點其中沒有任何命名空間」而你真正想說的是「我想選擇稱爲Thing節點其命名空間http://My/Project.xsd。這是XPath 1.0規範的工作原理(更多詳細信息,請參見this文章)。

擺脫間距: 在樣式表的開始使用<xsl:strip-space elements="*"/>指令指定您不希望從所有來源的元素空間,以輸出文檔中保存。如果您想保留其中的一些,請使用<xsl:preserve-spaces elements="myNode">

+4

要補充一點,你得到空白的原因是你的樣式表中有內置的模板規則處理你沒有明確匹配的節點。文本節點的默認規則 - 即使是隻有空白的文本節點 - 也是將其複製到輸出。除了xsl:strip-space之外,另一種防止這種情況的方法是添加規則'',這是一個空模板規則,這意味着當處理器擊中文本節點時, – 2011-04-01 08:26:26

+0

Michael,非常好的評論!感謝您閱讀本書,btw :) – 2011-04-01 09:49:54

+0

另一個補充:您可以在XSLT/XPath中用'* [local-name()='whatever']選擇元素而不考慮名稱空間1.0或XSLT/XPath 2.0中的'*:whatever' – 2011-04-01 16:08:52