为什么normalize-space()不会剥离所有空格?

Adr*_*ian 3 xml xslt removing-whitespace

我写了一个小XSLT,我在其中添加normalize-space()了删除不必要空格的函数:

http://xsltransform.net/bnnZWM

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

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

<category> TEST </category>
Run Code Online (Sandbox Code Playgroud)

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

mic*_*57k 6

正如评论中所指出的,角色真的是非空洞的角色(#160).要将它们作为常规空间处理,请使用:

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


kjh*_*hes 5

归一化空间()函数条空白

[3]       S      ::=      (#x20 | #x9 | #xD | #xA)+
Run Code Online (Sandbox Code Playgroud)

周围的人物TEXT在你的链接的例子是不是这些字符(如@ har07在评论中指出)。根据@michael.hor257k 对 的巧妙使用string-to-codepoints()

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

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

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

XSLT 1.0

请参阅@michael.hor257k 的回答。 (+1)

XSLT 2.0

如果你想覆盖&nbsp;与其他类型的空白字符,以及使用replace()带有类别逃生提前normalize-space()

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