XPath translate() 函数和(分解)组合的 Unicode 字符

was*_*ien 0 xslt xpath

采用以下 XSLT 代码:

\n
<?xml version="1.0" encoding="UTF-8"?>\n<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"\n    version="2.0">\n    <xsl:output method="text"/>\n    <xsl:template match="/">\n        <xsl:value-of select="translate('abc', 'e\xcc\x81abc', 'eabc')"/>  <!--0x65CC81-->\n        <xsl:value-of select="'&#10;'"/>\n        <xsl:value-of select="translate('abc', '\xc3\xa9abc', 'eabc')"/>  <!--0xC3A9-->\n    </xsl:template>\n</xsl:stylesheet>\n
Run Code Online (Sandbox Code Playgroud)\n

使用 Saxon 10 运行此命令会返回:

\n
bc\nabc\n
Run Code Online (Sandbox Code Playgroud)\n

翻译函数的第一次调用使用 \xc3\xa9 的分解形式(U+0065 和 U+0301),而第二次调用则使用 U+00E9。看来他们并没有受到平等的对待。这是可以预料的吗?这种行为是否在某处指定?

\n

Mic*_*Kay 5

请参阅https://www.w3.org/TR/xpath-functions-31/#character-terminology \xc2\xa71.7.1,其中指出:

\n
\n

除非明确说明,否则本文档中的函数返回的 xs:string 值并未在[万维网字符模型 1.0:基础知识] 意义上进行标准化。

\n
\n

因此,translate() 函数将 Unicode 代码点作为输入,并生成 Unicode 代码点作为输出,并且不关心这些代码点是表示组合字符还是分解字符。如果您想要标准化,则必须使用该normalize-unicode()函数显式调用它。

\n

(上面的引用对我来说有点模糊。“未标准化”意味着“没有采取任何行动来标准化字符串”,并不意味着“字符串不会采用标准化形式”。)

\n