xsl条件检查应用模板

时间:2012-04-20 09:47:56

标签: xslt

我的xsl就像

<root>
    <tests>
        <test id="222">
         <actionId>233</actionId>
        </test>
        <test id="22">
         <actionId>23333</actionId>
        </test>
    </tests>
    <confs>
        <conf id="2211"></conf>
    </confs>
</root>

    <xsl:key name="confId" 
        match="confs/conf" 
        use="@id" /
<xsl:template match="main">
Test:
<xsl:apply-templates select="tests/test" />
</xsl:template>
 <xsl:template match="tests/test">
<xsl:choose>
            <xsl:when test="actionId[.='']">
                <li>
                    <xsl:choose>
                        <xsl:when test="key('confId', @id)">
                            Used </xsl:when>
                        <xsl:otherwise> Not found</xsl:otherwise>
                    </xsl:choose>
                </li>
            </xsl:when> 
            <xsl:otherwise> <li>Not at all found</li></xsl:otherwise>
        </xsl:choose>
 </xsl:template>

现在'发现并非完全'消息打印在此模板匹配的每次迭代上,因为actionId不为null,如果条件没有执行,我只需要打印一次。

预期输出

  • 完全没有找到
  • 只在测试/测试模板中的actionId找不到匹配项时打印一次,即
  • 根本找不到
  • 不在模板

    中迭代

    1 个答案:

    答案 0 :(得分:0)

    每次激活match =“test”模板时,它只能使用源文档中的test元素或模板参数或全局变量提供的信息。它不能使用以前激活的任何知识,因为XSLT是无状态的。

    如果要以不同于其他元素的方式处理第一个测试元素,请编写两个不同的模板规则。

    如果你想特别用actionId [。='']处理第一个测试元素,那么写一个匹配它的模板规则:

    <xsl:template match="test[actionId[.=''][1]">