使用xpath删除不可破坏的空格

use*_*825 5 xml xpath

我有以下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>
Run Code Online (Sandbox Code Playgroud)

我必须删除所有不可破坏的空格,连接文本并将其正常化.

我的xpath查询(它适用于连接和规范化 - 我已将替换为'x'仅用于测试目的):

normalize-space(replace(string-join(//data/*,' '),'&#160;','x'))
Run Code Online (Sandbox Code Playgroud)

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

期待您的回答,

Ian*_*rts 7

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

normalize-space(translate(//data, '&#160;', ''))
Run Code Online (Sandbox Code Playgroud)

会做你需要什么,假设你的文件只包含一个data元素-如果有一个以上的data元素,则该表达式将只提取和标准化的文本第一个 data文档中的元素.

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

XPath.evaluate("normalize-space(translate(//data, '\u00A0', ''))", contextNode)
Run Code Online (Sandbox Code Playgroud)

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

normalize-space(translate(//data, codepoints-to-string(160), ''))
Run Code Online (Sandbox Code Playgroud)