2010-11-18 66 views
1

爲什麼<xsl:for-each select="text()">忽略空格?爲什麼<xsl:for-each select =「text()」>忽略空格?

示例XML來源:

<body> 
Things<note>such as people</note> <note>or animals</note>act in crazy ways. 
</body> 

例XSL:

<xsl:template match="body"> 
    <output> 
     <xsl:for-each select="text()"> 
      <text> 
       <xsl:value-of select="."/> 
      </text> 
     </xsl:for-each> 
    </output> 
</xsl:template> 

我希望這樣的輸出:

<output> 
    <text>Things</text><text> </text><text>act in crazy ways.</text> 
</output> 

但我得到的是這樣的:

<output> 
    <text>Things</text><text>act in crazy ways.</text> 
</output> 

有人能告訴我一些這方面的工作原理嗎?

謝謝!

回答

2

這不是<xsl:for-each>忽略空白文本節點,而是在您的樣式表模板看到它們之前,在解析輸入文檔時可能會剝去空白文本節點。

根據XSLT規範,默認情況下,XSLT會剝離樣式表文檔中除<xsl:text>元素以外的空白文本節點;但是除非您使用<xsl:strip-space>,否則不會從源文檔中除去它們。

XSLT 1.0 spec這樣描述:

樹的源文件 或樣式表文件後一直 建造,但在此之前它是 否則XSLT處理一些文本 節點被剝離。一個文本節點是 不會被剝離,除非它僅包含 空格字符。剝離 文本節點會從 樹中刪除文本節點。剝離過程需要 作爲 的一組元素名稱輸入,其中必須保留空白。 汽提過程被施加到 兩個樣式表和源文件, 但該組的空白保留 元素名稱爲樣式表和用於 源文檔確定 不同。

如果任何 的下列應用文本節點被保留:

  • 文本節點的父元素的名稱是在集合空白保留元素名稱。

  • 該文本節點至少包含一個非空白字符。與XML一樣,空格字符是#x20,#x9,#xD或#xA。

  • 文本節點的祖先元素具有值爲preserve的xml:space屬性,並且沒有更接近的祖先元素具有xml:具有默認值的空間。

否則,文本節點被剝離。

xml:space屬性不是從樹中剝離的 。

注意:這意味着如果在 文字結果元素上指定了xml:space屬性,則結果中將包含 。

對於樣式表,保留空白的元素名稱 的集合僅包含xsl:text。帶空間和 的xsl:保留空間頂級元素

對於源文件,所述一組 空白保留元素名稱由XSL指定 。這些元素每個都有一個元素屬性,其值是以空格分隔的NameTests列表。 最初,保留空白的元素名稱集合包含所有元素名稱。 [強調我的]如果元素名稱與xsl:strip-space元素中的NameTest相匹配,那麼它將從保留空白元素名稱的集合中刪除。如果元素名稱與xsl:preserve-space元素中的NameTest相匹配,則將其添加到保留空白元素名稱的集合中。

因此,總之,剝離不應該發生在您的源文件中......除非您在樣式表中使用<xsl:strip-space>頂級元素。如果您沒有使用<xsl:strip-space>,請告訴我們更多關於您的XSLT處理器和頂級樣式表元素的信息。

根據this article,並非每個XSLT處理器都遵守規範中描述的默認行爲。您可以嘗試添加以下爲<xsl:stylesheet>一個孩子,看它是否解決了這個問題:

<xsl:preserve-space elements="*"/> 
+0

@LarsH:事實上,每個XSLT處理器都有不同的選擇。您自己的鏈接的相關部分:http://xmlplease.com/whitespace#s7。 – 2010-11-18 20:17:21

+0

@Alej,對......我應該澄清說我描述的是規範說的。然而這就是爲什麼我把這個鏈接包含進來並詢問OP使用什麼處理器的原因。 – LarsH 2010-11-18 20:28:21

+0

但我正在使用 joe 2010-11-18 20:32:55

3

大約有空格純文本從每一個XSLT處理器(實際上是從XML樹提供商)製成型動物的選擇來自輸入源的節點。

其中大多數(最重要的是......)尊重xsl:preserve-space指令。

+0

好點。 +1讓讀者瞭解XMLSpy的自主開發的處理器和Stylus Studio不在那些「那個數量」之內......或者不在該文章寫入時。 (http://xmlplease.com/whitespace#s7。) – LarsH 2010-11-18 20:47:54

相關問題