您的直接问题是,虽然unicode 160(十六进制0xA0)
是一个HTML实体,但它不是一个XML实体。
使用 
或 
代替非空白区域。
但是对于你的大问题,如何处理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
,TAB
和SPACE
组成的>
和<
之间的任何东西。由非空白文本组成的节点,带有前导和尾随空白,可能有“折叠”的空白 - 即。结束了。
所以实施例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\ relative\path \&10;filename.txt"/>
<MyElem fullPath="c:\base\Path\here\	 relative\path	 \	&10;	filename.txt"/>
其中只有一个是你想要的... 但其中的任何一个可能是正确的取决于有效的选项...
来源
2013-04-03 22:05:06
Ben
的可能duplcate:http://stackoverflow.com/questions/31870/using-a-html-entity-in-xslt-eg-nbsp – Clint 2013-04-03 22:03:31