您面临的直接问题是,虽然 unicode 160 (hex 0xA0)
是 HTML 实体,而不是 XML 实体。
Use  
or  
改为不间断空格。
然而,对于更大的问题,即如何处理 XSL 中的空白,答案很简单:使用<xsl:text>
.
每次包含任何纯文本时,请将其括在<xsl:text> the text goes here </xsl:text>
标签。如果不这样做,下次聪明的文本编辑器重新格式化您的文档时,您将陷入痛苦的境地。
您已经进入了至少一个大陆,或者如果您幸运的话,可能会进入一个痛苦的国家,因为期望 XML/XSL 保留空白。即使是非常了解 XSL 的天才,仍然会因空格处理而遭受县级或至少市级的痛苦。 (自治市级别的痛苦被编码在 XML 规范“2.11 行尾处理”中,其疯狂的设计决定拒绝区分 LF 和 CRLF - 所以没有人可以避免这一点)。
只是为了让您知道会发生什么:这并不容易 - 您可以在没有<xsl:text>
标签的时间惊人地长,但如果你接受它,并从一开始就把它们放进去,从长远来看,它会更容易。
错误示例:
<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>
右例:
<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>
问题是,他们两者产生完全相同的输出.
但其中之一将是在未来的某个时刻搞砸了,是的,可能由尚未出生的人,另一个不会。
简短的解释是这样的:默认情况下,仅包含空白的节点将被忽略(除非您调整选项)。所以这就是仅由以下组成的任何东西CR
, LF
, TAB
and SPACE
之间>
and <
。由非空白文本组成的节点,具有前导和尾随空白,可能具有“折叠”的空白 - 即情绪激动。
所以示例 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"/>
只有其中之一是你想要的......但其中任何一个都可能是正确的取决于有效的选项...