SAXON 中的错误?它为叶元素生成两个相邻的文本节点

Bug in SAXON? It generates two adjacent text nodes for a leaf element

在 xml-dev 列表中,Michael Kay 写道:

In the XDM model the content of the Test element is a single text node. XDM does not allow two adjacent text nodes.

我相信 SAXON 使用 XDM 模型。

考虑这个叶元素:

<Test>
    abc<!-- aaa -->def
</Test>

我 运行 SAXON 使用这个 XSLT 程序:

<xsl:template match="Test">
    <xsl:message>count = <xsl:value-of select="count(text())"/></xsl:message>
</xsl:template>

输出为:

count = 2

这是不正确的,因为它说叶元素包含两个相邻的文本节点,这显然与迈克尔在 xml-dev 列表中所说的相矛盾。你同意吗?

你在哪里测试这两个文本节点是相邻的? XDM 中的 Test 元素有三个子节点,第一个是文本节点,第二个是注释节点,第三个是另一个文本节点。所以 count(text()) 是 2.

一旦 count(text()[following-sibling::node()[1][self::text()]|preceding-sibling::node()[1][self::text()]]) 给出的值大于 0,XDM 中的表示就会出现错误。

可以使用 Saxon-JS 和 JavaScript 创建的 DOM 树,您可以在其中创建两个单独的文本子节点:

const doc1 = new DOMParser().parseFromString('<root/>', 'application/xml');
doc1.documentElement.appendChild(doc1.createTextNode('Text child 1.'));
doc1.documentElement.appendChild(doc1.createTextNode('Text child 2.'));
console.log(doc1.documentElement.childNodes.length);

var result = SaxonJS.XPath.evaluate(`/*/count(text())`, doc1);

console.log(result);

var result2 = SaxonJS.XPath.evaluate(`/*/count(text()[following-sibling::node()[1][self::text()]|preceding-sibling::node()[1][self::text()]])`, doc1);

console.log(result2);

doc1.normalize();

result = SaxonJS.XPath.evaluate(`/*/count(text())`, doc1);

console.log(result);

result2 = SaxonJS.XPath.evaluate(`/*/count(text()[following-sibling::node()[1][self::text()]|preceding-sibling::node()[1][self::text()]])`, doc1);

console.log(result2);
<script src="https://www.saxonica.com/saxon-js/documentation2/SaxonJS/SaxonJS2.rt.js"></script>

但是对文档的 normalize 调用解决了这个问题。