如何用XSL生成外部查找表并在XSLT 2.0脚本中引用?
XSL 2.0 外部查找表实现方案
你不需要修改原有查询逻辑,两种方案都可以直接替换原来的硬编码查找表,按需选择即可。
方案1:直接引用源XML作为查找表(零额外转换步骤,最省事)
你不需要提前把源XML转成<row>属性结构,XSL 2.0原生支持加载外部XML做数据匹配,操作步骤:
- 把原来硬编码
$lookup变量的代码替换为加载外部文件的逻辑,如果要完全兼容原有查询代码,可以在加载时直接把源数据转成你熟悉的row结构,后续查询代码一行都不用改
<!-- 路径填写源XML文件相对于XSL执行位置的相对/绝对路径,建议同目录下直接写文件名 --> <xsl:variable name="raw-source" select="doc('rts-source.xml')"/> <xsl:variable name="lookup"> <xsl:for-each select="$raw-source/doc/BO/RTS"> <row Code="{Code}" Val="{Val}"/> </xsl:for-each> </xsl:variable>
- 原有查询逻辑完全保留,比如根据Code查对应Val的写法和之前完全一致:
<!-- 示例:查询Code为001对应的Val值 --> <xsl:value-of select="$lookup/row[@Code='001']/@Val"/>
注意:你贴出的源XML示例末尾标签闭合有误,正式使用前必须保证源XML是格式良好的,所有开标签都有对应闭合标签,否则
doc()函数加载会直接报错。
方案2:预生成独立查找表文件(适合多脚本共用同一份查找表)
如果你的多份XSL脚本都要用到同一份查找表,可以提前把源数据转成和原硬编码结构完全一致的独立XML文件,每次源数据更新只需要重新生成一次查找表即可:
- 首先写一个极简的转换脚本
gen-lookup.xsl,专门用来生成查找表:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes" encoding="UTF-8"/> <xsl:template match="/"> <lookup> <xsl:for-each select="doc/BO/RTS"> <row Code="{Code}" Val="{Val}"/> </xsl:for-each> </lookup> </xsl:template> </xsl:stylesheet>
- 每次源数据更新后,用XSL 2.0处理器(比如Saxon、编辑器内置的XSL转换功能)对源XML执行上述转换,输出得到
lookup-table.xml,文件结构和你之前硬编码在变量里的内容完全一致。 - 在业务XSL中直接加载预生成的查找表即可,原有业务逻辑不需要任何修改:
<xsl:variable name="lookup" select="doc('lookup-table.xml')/lookup"/>
新手实用优化提示
- 所有外部文件优先放在和XSL脚本同目录下,直接写文件名引用,避免路径解析错误
- 如果查找表数据量超过100条,建议搭配
<xsl:key>做索引,查询速度会比直接写XPath遍历快很多:
<!-- 全局定义查找索引 --> <xsl:key name="lookup-val" match="row" use="@Code"/> <!-- 查询时用key函数调用 --> <xsl:value-of select="key('lookup-val', '001', $lookup)/@Val"/>
内容的提问来源于stack exchange,提问作者noobSlayer
相关产品推荐
相关产品推荐

