首页 > 解决方案 > XSLT 检查是否发生在 for-each 中并使用该信息

问题描述

我没有办法解决这个问题,因为我无法在 XSLT 中更改变量的值。希望您可以为以下问题提供适当的方法:

这是一个示例 xml-node,我将引用它来解释问题:

<information>
   <uselessNode1></uselessNode1>
   <uselessNode2></uselessNode2>
   <importantNode></importantNode>
</information>

我这里本质上需要的是遍历信息节点的所有子节点。importantNode 是可选的,我要检测的是该节点是否存在。如果重要节点在那里,它将在 for-each 循环中处理,一切都很好。如果没有 importandNode,我必须证明它在 for-each 循环之外不存在。

因此,如果在信息节点的模板中具有以下 for-each 循环:

 <xsl:for-each select="*"> 
    <xsl:choose>
       <xsl:when test="not( name() = 'importantNode')">
          USELESS
       </xsl:when>
       <xsl:otherwise>
          IMPORTANT
       </xsl:otherwise>
    </xsl:choose>
 </xsl:for-each>

输出是“无用无用的重要”。如果重要节点不存在,则输出为“无用无用”。我实际上需要的是一个提示,而不是“无用无用”,它表明重要节点不存在,例如“无用无用 IMPORTANT_MISSING”。

我尝试在 for-each 循环中设置一个变量,如果进入 -case 并尝试在 for-each 循环之外检查它会引发错误,即变量 $importantFound 未声明或超出其范围。我虽然在 for-each 循环之前声明它会有所帮助。由于我不能在 for-each 循环之前声明变量并在循环内部的 else 情况下更改它的值,我不知道如何解决这个困境。

我希望对我的问题的解释足够清楚,可以理解。谢谢大家。

标签: xslt

解决方案


如果没有 importandNode,我必须证明它在 for-each 循环之外不存在。

那么为什么你不能做到这一点 - 例如:

<xsl:template match="information">
    <xsl:for-each select="*"> 
        <xsl:choose>
            <xsl:when test="not(self::importantNode)">USELESS </xsl:when>
            <xsl:otherwise>IMPORTANT </xsl:otherwise>
        </xsl:choose>
    </xsl:for-each>
    <xsl:if test="not(importantNode)">IMPORTANT_MISSING</xsl:if>
</xsl:template>

推荐阅读