XSL - 删除不间断空格

4
在我的XSL实现中(2.0),我尝试使用以下语句来删除文本节点内的所有空格和非换行空格。它可以删除空格,但无法删除非换行空格,其ASCII代码为:                              ​ 等。我正在使用SAXON处理器执行。

当前的XSL代码:

translate(normalize-space($text-nodes[1]),  ' ' , '' ))

我该如何将它们删除?请分享您的想法。

1个回答

8

这些代码是Unicode而不是ASCII(大部分情况下),因此您应该使用replace函数,其中包含Unicode分隔符字符类regex

replace($text-nodes[1], '\p{Z}+', '')

更详细地说:
正则表达式\p{Z}+匹配一个或多个Unicode中“分隔符”类别中的字符。\p{}类别转义序列,它匹配在大括号中指定的类别中的单个字符。Z指定“分隔符”类别(包括各种空白字符)。+表示“匹配前面的正则表达式一次或多次”。replace函数返回其第一个参数的版本,并用其第二个参数替换所有不重叠的子字符串,替换为其第三个参数。因此,这将返回$text-nodes[1]的一个版本,其中所有分隔符字符序列都被替换为空字符串,即被删除。

'[\p{Z}]+' 中的方括号是否必要?'\p{Z}+' 不应该就足够了吗? - Martin Honnen
我在最初回答时不确定那一点,所以为了保险起见加上了它们。我刚刚再次查看了规范,你是正确的,方括号是不必要的,所以我将其删除了。 - wdebeaum
@wdebeaum:你能解释一下这个正则表达式吗? - Rachel
@Rachel:看到我的修改了吗?我想想,这个 + 也没必要,但是为了教育价值,我还是留下了它。可能还能稍微提高效率,我不确定。 - wdebeaum
上述提到的正则表达式在指定字符方面运行良好。我遇到了一些特殊字符,它们看起来像空格或什么都没有,并且这些字符属于不同的Unicode类别。http://www.fileformat.info/info/unicode/category/Zs/list.htm,http://www.fileformat.info/info/unicode/category/Cf/list.htm,http://www.fileformat.info/info/unicode/category/Cc/list.htm。上述类别中有一些字符看起来像空格或什么都没有。如何忽略这些来自上述族群的看起来像空格或什么都没有的字符? - Rachel
您需要链接的三个类别是“Zs”、“Cf”和“Cc”。我认为“Zs”包含在“Z”中,因此,如果您想要匹配其他两个类别中的所有字符,可以将它们的\p{}转义符放在方括号中,如下所示:[\p{Z}\p{Cf}\p{Cc}]。如果您只想要这些类别中的特定字符,则可以包含用于它们的实体引用。例如,要匹配分隔符,加上“零宽度空格”和“null”,请使用此正则表达式:[\p{Z}​�] - wdebeaum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接