如何在XSLT 3.0中读取JSON对象并查询键值对
在XSLT 3.0中结合JSON例外词表实现自定义断词逻辑
1. 读取并解析JSON例外词表
在XSLT 3.0中,可通过fn:json-doc()函数直接读取并解析JSON文件,将其转换为XPath的map类型(对应JSON对象),方便后续通过键值快速访问。先在样式表中定义全局变量$exceptions:
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:map="http://www.w3.org/2005/xpath-functions/map" xmlns:fn="http://www.w3.org/2005/xpath-functions"> <!-- 读取并解析JSON例外词表 --> <xsl:variable name="exceptions" select="json-doc('exceptions.json')"/> <!-- 其他模板与逻辑 --> </xsl:stylesheet>
json-doc()会自动完成JSON到XPath map的映射:
- 顶级JSON对象 → 顶级map(键为语言代码
"en"、"de"等) - 语言对应的子对象 → 子map(键为目标单词,值为预定义断词结果)
2. 修改断词模板实现例外逻辑
修改原有的文本匹配模板,在调用fn:hyphenate()前先检查当前单词是否在对应语言的例外词表中:
<xsl:template match="p[lang('en')]/text()"> <xsl:analyze-string select="." regex="\w+"> <xsl:matching-substring> <xsl:choose> <!-- 检查当前单词是否在英文例外词表中 --> <xsl:when test="map:contains($exceptions?en, .)"> <!-- 返回预定义的断词结果 --> <xsl:value-of select="$exceptions?en(.)"/> </xsl:when> <xsl:otherwise> <!-- 无例外时调用默认断词函数 --> <xsl:value-of select="fn:hyphenate(., '', 'en')"/> </xsl:otherwise> </xsl:choose> </xsl:matching-substring> <xsl:non-matching-substring> <xsl:value-of select="."/> </xsl:non-matching-substring> </xsl:analyze-string> </xsl:template>
关键逻辑说明:
$exceptions?en:通过?操作符安全访问顶级map中的"en"子map(若不存在则返回空,避免报错)map:contains($exceptions?en, .):检查当前匹配的单词(.代表<xsl:matching-substring>中的匹配内容)是否是子map的键$exceptions?en(.):通过键访问子map中的值,直接返回预定义断词结果
3. 多语言扩展提示
如果需要支持多语言(比如示例中的德语"de"),可根据当前节点的语言动态切换子map:
<xsl:template match="p/text()"> <xsl:variable name="current-lang" select="lang(.)"/> <xsl:analyze-string select="." regex="\w+"> <xsl:matching-substring> <xsl:choose> <xsl:when test="map:contains($exceptions?($current-lang), .)"> <xsl:value-of select="$exceptions?($current-lang)(.)"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="fn:hyphenate(., '', $current-lang)"/> </xsl:otherwise> </xsl:choose> </xsl:matching-substring> <xsl:non-matching-substring> <xsl:value-of select="."/> </xsl:non-matching-substring> </xsl:analyze-string> </xsl:template>
内容的提问来源于stack exchange,提问作者Tench
相关产品推荐
相关产品推荐

