XSLT 2.0使用Tunnel通道参数传递变量未达预期如何解决
问题原因
你编写的XSLT 2.0代码语法本身没有错误,在支持XSLT 2.0的处理器(比如Saxon 9+)中运行可以得到预期结果。出现空节点的核心原因是你当前使用的XSLT处理器仅支持XSLT 1.0版本,而隧道参数(Tunnel Parameter)是XSLT 2.0新增的特性,XSLT 1.0环境无法识别和传递该参数,导致last_mod_dt_TS模板中拿到的slaStart为空值。
解决方案
方案1:切换到XSLT 2.0处理器
如果业务允许,将运行环境的XSLT处理器替换为支持2.0规范的版本,即可直接运行你现有代码得到预期输出。
方案2:兼容XSLT 1.0的实现
如果必须使用XSLT 1.0环境,可以通过定义key实现分组取值,不需要隧道参数,代码如下:
<?xml version='1.0' encoding='UTF-8'?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" exclude-result-prefixes="#all"> <xsl:output indent="yes"/> <!-- 按request_Id对row节点分组 --> <xsl:key name="rowByReqId" match="row" use="request_Id"/> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <xsl:template match="last_mod_dt_TS"> <xsl:copy> <!-- 取当前行所属分组的第一个row的last_mod_dt_TS值 --> <xsl:value-of select="key('rowByReqId', ../request_Id)[1]/last_mod_dt_TS"/> </xsl:copy> </xsl:template> </xsl:stylesheet>
这个版本的代码在XSLT 1.0环境中也可以正常运行,输出和你预期的结果完全一致。
内容的提问来源于stack exchange,提问作者KarthikIT
相关产品推荐
相关产品推荐

