采用以下 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="' '"/>\n <xsl:value-of select="translate('abc', '\xc3\xa9abc', 'eabc')"/> <!--0xC3A9-->\n </xsl:template>\n</xsl:stylesheet>\nRun Code Online (Sandbox Code Playgroud)\n使用 Saxon 10 运行此命令会返回:
\nbc\nabc\nRun Code Online (Sandbox Code Playgroud)\n翻译函数的第一次调用使用 \xc3\xa9 的分解形式(U+0065 和 U+0301),而第二次调用则使用 U+00E9。看来他们并没有受到平等的对待。这是可以预料的吗?这种行为是否在某处指定?
\n请参阅https://www.w3.org/TR/xpath-functions-31/#character-terminology \xc2\xa71.7.1,其中指出:
\n\n\n除非明确说明,否则本文档中的函数返回的 xs:string 值并未在[万维网字符模型 1.0:基础知识] 意义上进行标准化。
\n
因此,translate() 函数将 Unicode 代码点作为输入,并生成 Unicode 代码点作为输出,并且不关心这些代码点是表示组合字符还是分解字符。如果您想要标准化,则必须使用该normalize-unicode()函数显式调用它。
(上面的引用对我来说有点模糊。“未标准化”意味着“没有采取任何行动来标准化字符串”,并不意味着“字符串不会采用标准化形式”。)
\n