如何仅在CDATA中使用Xpath保留换行符才能使用Saxon s9api读取节点值

时间:2018-12-07 14:23:56

标签: xml xslt xpath whitespace saxon

具有以下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节中包含了它的值,但是没有。

以下是用于在“数据”节点上执行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()来获取规范化的String,但是希望以编程方式进行检测:在CDATA节中使用时保留空白XML,否则将结果标准化。

是否有一种方法可以知道在使用s9api执行xpath时是否应保留空格?或有任何建议如何解决这个问题?

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

2 个答案:

答案 0 :(得分:1)

我不知道您为什么认为CDATA部分应该更改空白语义。 CDATA只是一种标记文本的方法,该文本未通过&lt;&gt;等实体引用进行转义。

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

答案 1 :(得分:0)

好吧,我一直在寻找一种方法来在我的应用程序和用户之间达成有关保留空白的契约。由于在格式化XML时Oxygen尊重CDATA,所以我想以同样的方式来做。

我想我将使用以下方法:如果节点包含值为 preserve 的属性 xml:space ,那么我将通过获取该值来保留所有空白xpath text()表示节点的位置。

否则,将使用xpath normalize-space()获取节点的normalizes值,删除所有前导和尾随空格以及双倍空白。

使用的Xpath 2:

if (@xml:space = 'preserve') then text() else normalize-space()

感谢您的回答!