如何在xslt中进行动态布尔检查

时间:2015-02-09 12:20:33

标签: xslt

从我的根模板获取唯一帐户值,调用转到模板输入xml我将有多个节点,我的要求是一旦调用从根模板转到反模板,如果找到匹配的accountId在多个元素之间,帐户详细信息模板仅被调用一次,而不管找到的其他匹配项。我需要满足上述要求的解决方案。

输入样本:

  <elements><accountId>1</accountId></elements>
  <elements><accountId>1</accountId></elements>
  <elements><accountId>2</accountId></elements>
  <elements><accountId>2</accountId></elements>
  <elements><accountId>3</accountId></elements>

以下行应包含在某些代码下,因此只调用一次

<xsl:call-template name="Account_details" />

以下是xsl

的完整代码
    <xsl:template match="/">
         <xsl:variable name="unique-accounts" select="//*/*/*/accountId/text()[generate-id()=generate-id(key('account-by-id', .)[1])]"/>
         <xsl:for-each select="$unique-accounts">
             <xsl:variable name="currentValue" select="current()"/>
                <xsl:apply-templates select="//trans">
                <xsl:with-param name="passCurrentValue" select="$currentValue"/>
                 </xsl:apply-templates>
         </xsl:for-each>
</xsl:template>

<xsl:template match="trans"> 
    <xsl:param name="passCurrentValue" />
    <xsl:variable name="booleanValue" select="true()"/>

        <xsl:for-each select="elements">
                <xsl:if test="$passCurrentValue=/*/*/accountId">
                    <xsl:if test="$booleanValue">
                        <xsl:call-template name="Account_details" />
                        <xsl:variable name="booleanValue" select="false()"></xsl:variable>
                    </xsl:if>
        </xsl:for-each>
</xsl:template>

<xsl:template name="Account_details">
.............
</xsl:template>

1 个答案:

答案 0 :(得分:0)

使用代码

<xsl:template match="/">
<xsl:variable name="booleanCheck" select="true"></xsl:variable>

变量booleanCheck是文档节点true下面的节点集(XSLT 1.0)或名为/的元素序列。因此,除非您的XML输入具有名为true的根元素,否则该值是空节点集,分别为空序列。如果要选择布尔值,请使用<xsl:variable name="booleanValue" select="true()"/>。见http://www.w3.org/TR/xpath/#function-true。然后你可以测试<xsl:if test="$booleanValue">。这应该解释如何使用布尔值,这是否适合您的上下文我不确定。