2013-04-03 53 views
1

我試圖按照以下方式在XSL文檔中創建自動間距。在XSL中創建空間( )

<td><xsl:value-of select="Name/First"/> <xsl:text disable-output-escaping="yes"><![CDATA[&nbsp;]]></xsl:text><xsl:value-of select="Name/Last"/> </td> 然而,呈現的HTML的形式如下

<td>John&amp;nbsp;Grisham</td> 

對我怎麼能解決這個問題的任何想法?

+0

的可能duplcate:http://stackoverflow.com/questions/31870/using-a-html-entity-in-xslt-eg-nbsp – Clint 2013-04-03 22:03:31

回答

2

您的直接問題是,雖然unicode 160(十六進制0xA0)&nbsp;是一個HTML實體,但它不是一個XML實體。

使用&#160;&#xA0;代替非空白區域。

但是對於你的大問題,如何處理XSL中的空白,答案很簡單:使用<xsl:text>

每次包含任何純文本時,請將其包含在<xsl:text> the text goes here </xsl:text>標記中。如果你不這樣做,下一次巧妙的文本編輯器會重新格式化文檔時,你將面臨一個痛苦的世界。

對於希望XML/XSL節省空白的情況,您至少已經進入了一個大洲,或者可能是幸運的國家。即使是將XSL理解爲第n級的天才,仍然會因爲空白處理而獲得縣級或至少自治區級別的痛苦。 (自治區級別的痛苦是在XML規範中編碼的,「2.11行尾處理」由其瘋狂的設計決定拒絕區分LF和CRLF - 所以沒有人能夠避免)。

這樣你就知道該期待什麼了:這並不容易 - 你可以在沒有<xsl:text>標籤的情況下離開很長時間,但如果你只是接受它,並從一開始就把它放進去,從長遠來看會更容易。

例WRONG:

<xsl:element name="MyElem"> 
     <xsl:attribute name="fullPath">c:\base\Path\here\<xsl:value-of select="../parent/@relPath"/>\<xsl:value-of select="@fileName"> 
     </xsl:attribute> 
    </xsl:element> 

例RIGHT:

<xsl:element name="MyElem"> 
     <xsl:attribute name="fullPath"> 
      <xsl:text>c:\base\Path\here\</xsl:text> 
      <xsl:value-of select="../parent/@relPath"/> 
      <xsl:text>\</xsl:text> 
      <xsl:value-of select="@fileName"> 
     </xsl:attribute> 
    </xsl:element> 

事情是,它們都產生相同的輸出

但他們中的一個將在未來在某些時候搞砸了,是的,可能有人爲尚未出生,其他的不會。

簡短的解釋是這樣的:默認情況下,只包含WHITESPACE的節點被忽略(除非你調整了選項)。這就是任何只由CR,LF,TABSPACE組成的><之間的任何東西。由非空白文本組成的節點,帶有前導和尾隨空白,可能有「摺疊」的空白 - 即。結束了。

所以實施例RIGHT和這之間的差:

<xsl:element name="MyElem"> 
     <xsl:attribute name="fullPath"> 
      c:\base\Path\here\ 
      <xsl:value-of select="../parent/@relPath"/> 
      \ 
      <xsl:value-of select="@fileName"> 
     </xsl:attribute> 
    </xsl:element> 

是一個產生<MyElem fullPath="c:\base\Path\here\relative\path\filename.txt"/>和其他,這取決於力的DOM選項,產生下列操作之一:

<MyElem fullPath="c:\base\Path\here\relative\path\filename.txt"/> 
<MyElem fullPath="c:\base\Path\here\ relative\path \ filename.txt"/> 
<MyElem fullPath="c:\base\Path\here\&#10;relative\path&#10;\&10;filename.txt"/> 
<MyElem fullPath="c:\base\Path\here\&#9;&#10;relative\path&#9;&#10;\&#9;&10;&#9;filename.txt"/> 

其中只有一個是你想要的... 但其中的任何一個可能是正確的取決於有效的選項...

+0

直接替換導致'​​吉姆&#160;'塞巴斯蒂安,那也不能達到目的! – KodeSeeker 2013-04-03 22:20:17

+0

@KodeSeeker,不要把它放在CDATA中,把它作爲一個文字。 – Ben 2013-04-04 06:36:52

-1

使用此<xsl:text disable-output-escaping="yes">&amp;</xsl:text>nbsp;它工作!

+0

請使用您問題上的編輯鏈接添加其他信息。後回答按鈕應該只用於問題的完整答案。 – 2013-04-03 22:43:07

+0

完成。你在找這個嗎? – KodeSeeker 2013-04-03 22:48:27