XSL模板内调用模板失效及条件调用failure模板咨询
解决XSL模板内调用模板的条件判断及生效问题
首先看你的代码里的核心问题:原来注释中的条件用了and,这意味着要同时满足test-result是FAILURE和SKIP——这显然不可能,所以模板永远不会被调用。我们先修正条件逻辑,再排查调用不生效的其他可能原因。
一、修正条件判断逻辑
你需要把and改成or,同时确保条件针对当前execution-output节点下的test-result子节点。修正后的代码如下:
<xsl:for-each select="execution-output"> <!-- 当execution-output下存在result为FAILURE或SKIP的test-result时,调用failure模板 --> <xsl:if test="test-result[@result = 'FAILURE' or @result = 'SKIP']"> <xsl:call-template name="failure"/> </xsl:if> </xsl:for-each>
如果你的场景是每个符合条件的test-result都对应一次调用(比如一个execution-output下有多个test-result),可以调整逻辑,直接遍历目标节点:
<xsl:for-each select="execution-output/test-result[@result = 'FAILURE' or @result = 'SKIP']"> <xsl:call-template name="failure"/> </xsl:for-each>
二、排查模板调用不生效的常见原因
如果修正条件后还是无法调用failure模板,建议从以下几点逐一排查:
模板名称是否完全匹配:XSL对名称大小写敏感,检查定义
failure模板时的name属性是否和调用时完全一致。示例正确定义应该是:<xsl:template name="failure"> <!-- 你的模板处理内容 --> </xsl:template>节点上下文是否正确:确认
execution-output节点下确实存在符合条件的test-result。可以添加调试信息验证:<xsl:for-each select="execution-output"> <xsl:message>当前execution-output的test-result值:<xsl:value-of select="test-result/@result"/></xsl:message> <xsl:if test="test-result[@result = 'FAILURE' or @result = 'SKIP']"> <xsl:call-template name="failure"/> </xsl:if> </xsl:for-each>运行时查看输出的调试信息,确认是否存在符合条件的节点。
命名空间是否匹配:如果你的XML文档中
test-result或result属性带有命名空间,需要在XSL中声明对应的命名空间前缀,并在条件中使用。比如:<!-- 顶部声明命名空间 --> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:test="http://your-namespace-url"> <!-- 条件中使用前缀 --> <xsl:if test="test:test-result[@test:result = 'FAILURE' or @test:result = 'SKIP']"> <xsl:call-template name="failure"/> </xsl:if> </xsl:stylesheet>模板是否被正确引入:如果
failure模板定义在另一个XSL文件中,需要用<xsl:import>或<xsl:include>将其引入到当前模板所在的样式表中。
内容的提问来源于stack exchange,提问作者user3082545
相关产品推荐
相关产品推荐

