2013-04-03 82 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