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
调用解决了这个问题。
在 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
调用解决了这个问题。