首页 > 解决方案 > 如何仅在 CDATA 中使用 xpath 保留换行符来使用 Saxon s9api 读取节点值

问题描述

具有以下 XML 结构:

<Data>
    line 1
    line 2  and some text
 </Data>

我想使用 xpath //Data/text()获取Data节点的内容

但是使用 s9api 执行 xpath 会产生以下字符串:

     line 1
     line 2  and some text

保留新行和双空格的位置。如果 Data 节点在 CDATA 部分中包含它的值,那将是我想要的结果,但它没有。

在用于在 Data 节点上执行 xpath 的 Java 代码片段之后:

XPathExecutable exp = xPathCompiler.compile("text()");
XPathSelector selector = exp.load();
selector.setContextItem(item);
XdmItem evaluateSingle = selector.evaluateSingle();
result = evaluateSingle == null ? null : evaluateSingle.getStringValue();

我想让结果空白归一化:第 1 行第 2 行和一些文本

当然,我可以使用 xpath //Data/normalize-space()来获取规范化的字符串,但是希望以编程方式检测这一点:在 XML 中使用 CDATA 部分时保留空格,否则对结果进行规范化。

有没有办法知道在使用 s9api 执行 xpaths 时是否应该保留空格?或任何建议如何解决这个问题?

换句话说:当空白很重要时,我想保留它们,否则应该对空白进行规范化。

标签: xmlxsltxpathwhitespacesaxon

解决方案


我不知道你为什么认为 CDATA 部分应该改变空白语义。CDATA 只是一种标记文本的方式,这些文本没有使用 和 等实体引用进行&lt;转义&gt;

当然,XML 的规则之一是它只是语法,您可以将任何语义附加到您喜欢的任何标记结构,包括 CDATA 部分。但是,如果您将含义附加到 CDATA 标记,那么 XSLT 和 XQuery 将不会帮助您,因为它们明确地忽略它。


推荐阅读