如何让XSL/XSLT支持识别XInclude引入的XML文件内容
问题根因
XSLT处理器本身不会自动处理输入XML中的xi:include指令,该功能属于XML解析器的可选特性,默认处于关闭状态。你直接传入未展开XInclude的fruit.xml给XSLT时,处理的DOM树里保留的是<xi:include>标签本身,而非引入的apple.xml、banana.xml内容,自然无法匹配到apple、color等元素,导致校验失效、取值为空。
问题1排查项
思路本身没有问题,先按以下顺序排查:
- 首先确认XML解析器是否开启了XInclude展开特性,该配置是生效的前提。开启后重新执行XSLT处理,先测试路径
/fruit/apple/color能否正确输出RED,能输出则说明XInclude已正常展开。 - 确认XPath路径书写正确:XInclude展开后,
fruit根节点的直接子节点就是apple、banana等引入的元素,不需要携带xi命名空间匹配。 - XSLT 1.0本身没有限制访问展开后的XInclude内容,你之前取值为空基本都是未开启XInclude展开导致,和XSLT版本无关。
问题2所需额外配置
不同运行场景下开启XInclude的方式如下:
命令行处理场景
- 用Saxon处理器的话,添加
-xinclude:on参数即可,示例命令:saxon -s:fruit.xml -xsl:你的校验脚本.xsl -xinclude:on - 用xsltproc处理器的话,添加
--xinclude参数即可,示例命令:xsltproc --xinclude 你的校验脚本.xsl fruit.xml
代码调用场景
不管使用什么编程语言,都需要先手动构造XML解析器实例,开启XInclude特性后,再将解析好的DOM树传给XSLT处理器,不要直接传入fruit.xml文件路径让XSLT自行解析,避免默认关闭XInclude的问题。
校验规则示例
XInclude正常展开后,可参考以下规则校验苹果颜色:
<xsl:template match="/fruit/apple"> <xsl:if test="color != 'RED'"> <xsl:message terminate="yes">校验失败:苹果颜色非法,当前值为<xsl:value-of select="color"/></xsl:message> </xsl:if> </xsl:template>
内容的提问来源于stack exchange,提问作者DonBaka
相关产品推荐
相关产品推荐

