VSCode运行XSLT2.0输出异常 在线编译器可正常执行问题求助
XSLT 2.0代码在VSCode执行异常的排查解决方案
问题根因
VSCode默认搭载的XSLT处理器(多为libxslt)仅支持XSLT 1.0标准,无法匹配XSLT 2.0的语法规则和默认行为,未匹配的节点会触发默认模板输出内容,导致最终生成的XML出现多余标签。
排查步骤
- 确认当前使用的XSLT处理器版本:在终端执行
xsltproc --version,若返回结果为libxslt相关信息,即可确认处理器仅支持XSLT 1.0,为问题根源。 - 验证代码兼容性:你的代码未使用XSLT 2.0专属特性(如序列操作、正则函数、分组语法等),可先临时将样式表声明的
version="2.0"改为version="1.0"测试,若修改后输出正常,即可确认是处理器版本不匹配导致的问题。
解决方案
方案一:更换支持XSLT 2.0的处理器(推荐)
直接更换VSCode使用的XSLT处理器为支持2.0/3.0标准的Saxon,和主流在线XSLT编译器使用的处理器保持一致:
- 安装Saxon HE(开源免费版本):
- Windows:可直接下载Saxon HE的jar包,或通过包管理器Chocolatey执行
choco install saxon安装 - macOS:通过Homebrew执行
brew install saxon安装 - Linux:通过对应包管理器安装Saxon HE即可
- Windows:可直接下载Saxon HE的jar包,或通过包管理器Chocolatey执行
- 配置VSCode XSLT插件的处理器路径:打开你使用的XSLT相关插件的设置页,找到「处理器路径」配置项,填写已安装的Saxon可执行文件路径,若使用jar包则填写
java -jar 你的Saxon jar包绝对路径 - 重启VSCode后重新执行转换,即可得到预期结果。
方案二:修改代码兼容XSLT 1.0
如果不想更换处理器,可对代码做简单修改,即可在XSLT 1.0环境下正常运行:
- 将样式表声明的版本号从
2.0修改为1.0 - 新增默认模板规则,屏蔽未匹配节点的自动输出
修改后的完整代码如下:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > <xsl:output method="xml" indent="yes"/> <!-- 新增默认模板,避免多余内容输出 --> <xsl:template match="text()|@*"/> <xsl:template match="/document"> <document> <xsl:for-each select="page"> <page> <xsl:for-each select="block"> <xsl:if test = "@blockType='Text'"> <block blockType="{@blockType}"> <xsl:for-each select="text"> <text> <xsl:for-each select="par"> <paragraph> <line> <xsl:value-of select="line"/> </line> </paragraph> </xsl:for-each> </text> </xsl:for-each> </block> </xsl:if> <xsl:if test = "@blockType='Table'"> <block blockType="{@blockType}"> <xsl:for-each select="row"> <row> <xsl:for-each select="cell"> <cell> <xsl:for-each select="text"> <text> <xsl:for-each select="par"> <paragraph> <line> <xsl:value-of select="line"/> </line> </paragraph> </xsl:for-each> </text> </xsl:for-each> </cell> </xsl:for-each> </row> </xsl:for-each> </block> </xsl:if> </xsl:for-each> </page> </xsl:for-each> </document> </xsl:template> </xsl:stylesheet>
内容的提问来源于stack exchange,提问作者Kakashi
相关产品推荐
相关产品推荐

