6

我有以下 xml 文档:

<?xml version="1.0" encoding="UTF-8"?>
<root>
<data>
<child1>&#160;Well, some  spaces and nbsps  &#160;</child1>
<child2>&#160; some more                  &#160;  or whatever          </child2>
<child3>         a nice text</child3>
<child4>how                              to get rid of all the nasty spaces&#160;          ?                                  </child4>
</data>
</root>

我必须删除所有不可破坏的空格,连接文本并将其规范化。

我的 xpath 查询(它可以很好地用于连接和规范化 - 我已插入替换 'x' 仅用于测试目的):

normalize-space(replace(string-join(//data/*,' '),'&#160;','x'))

我的问题:我找不到"&#160;"-whitespace 来替换它。

期待您的回答,

4

1 回答 1

8

元素节点的字符串值被定义为其所有后代文本节点的串联,因此在 XSLT 转换中

normalize-space(translate(//data, '&#160;', ''))

会做你需要的,假设你的文档只包含一个data元素 - 如果有多个data元素,那么这个表达式将只提取和规范化文档中第一个 data元素的文本。

如果您在 XSLT 文件以外的地方使用 XPath 表达式,那么您将需要以不同的方式表示不间断空格字符。上面的示例之所以有效,是因为 XML 解析器&#160;在读取文件时将字符引用转换为不间断空格字符.xsl,因此 XPath 表达式解析器看到的是字符,而不是引用。例如,在 Java 中,我可以说

XPath.evaluate("normalize-space(translate(//data, '\u00A0', ''))", contextNode)

因为\u00A0是在 Java 字符串文字中表示 nbsp 字符的方式。如果您使用另一种语言,则需要找到用该语言表示此字符的正确方法,或者如果您使用的是 XPath 2.0,则可以使用以下codepoints-to-string函数:

normalize-space(translate(//data, codepoints-to-string(160), ''))
于 2012-11-05T17:25:35.820 回答