为什么 normalize-space() 不去除所有 spaces?

Why does normalize-space() not strip all spaces?

我写了一点 XSLT,其中添加了 normalize-space() 函数来去除不必要的空格:

http://xsltransform.net/bnnZWM

<xsl:template match="page/pageFunctionResult/*/text()">
   <xsl:value-of select="normalize-space(.)"/>
</xsl:template>

XSLT 本身可以工作,除了一些空格没有规范化:

<category> TEST </category>

我不明白为什么 normalize-space() 不能删除这些空格。

normalize-space() function strips whitespace:

[3]       S      ::=      (#x20 | #x9 | #xD | #xA)+

链接示例中 TEXT 周围的字符 不是 这些字符之一(正如 @har07 在评论中指出的那样)。根据@michael.hor257k 的 clever use of string-to-codepoints()

<xsl:template match="page/pageFunctionResult[1]/category[1]">
  <xsl:value-of select="string-to-codepoints(substring(., 1, 1))"/>
</xsl:template>

我们可以看到它们是 NO-BREAK SPACE 个字符 (#xA0),又名 &nbsp;

要删除 &nbsp;,您需要的不仅仅是 normalize-space()...

XSLT 1.0

(+1)

XSLT 2.0

如果您想覆盖 &nbsp; 以及其他类型的空白字符,请使用 replace() 并在 normalize-space() 之前添加 category escape:

<xsl:value-of select="normalize-space(replace(., '\p{Z}', ' '))"/>

如评论中所述,这些字符实际上是不间断的 SPACE 个字符 (#160)。要将它们作为常规空格处理,请使用:

<xsl:value-of select="normalize-space(translate(., '&#160;', ' '))"/>