XSLT:在for-each循环中使用模板标记变量和中断条件

时间:2010-01-12 06:04:27

标签: xslt

我正在使用XSLT,我在其中创建了<xsl:template>标记,该标记使用<xsl:for-each>语句进行了一些验证,并将<xsl:variable><xsl:param>的值设置为true或false 。

  1. 如果条件为真,有没有办法打破for-each中的语句?
  2. 我们可以使用来自主调用例程的Template变量或param的值吗?
  3. 示例:

    <!-- Main Xslt -->
    <xsl:template>
      <xsl:call-template name ="TestTemplate">
        <!--  
          Here I want to use the variable or param that 
          is defined in TestTemplate, is it possible?
        -->
      </xsl:call-template>
    </xsl:template>
    
    <xsl:template name ="TestTemplate">
      <xsl:param name="eee"/>
      <xsl:for-each select ="//RootNode/LeafNode">
        <xsl:choose>
          <xsl:when test ="@Type='ABC'">
            <xsl:value-of select ="true"/>
          </xsl:when>
          <xsl:otherwise>false</xsl:otherwise>
        </xsl:choose>
      </xsl:for-each>
    </xsl:template>
    

2 个答案:

答案 0 :(得分:3)

问题:

  

如果条件为真,有没有办法打破for-each中的语句?

不,通常这也是不必要的。 XSLT不是命令式编程语言,而且命令式方法在这里并不能很好地工作。

您似乎想要做的是表达“找到<LeafNode> @Type='ABC',然后根据是否存在,返回true或false。

在传统语言中执行此操作的方法与您的方法类似:对于每个节点,检查条件,如果条件满足则返回。

在XSLT中,您只需选择具有XPath的节点:

//RootNode/LeafNode[@Type='ABC']

这个结果包含一个节点,或者它没有。根本不需要for-each。

  

我们可以使用来自主调用例程的Template变量或param的值吗?

没有。变量和参数是严格的范围。一旦处理离开其父元素,它们就会超出范围。它们也是不变的,一旦宣布它们就无法改变。

在此处执行所需操作的方法是使模板输出成为所需值并将其捕获到变量中:

<xsl:template>
  <xsl:variable name="returnValue">
    <xsl:call-template name="TestTemplate" />
  </xsl:variable>
</xsl:template>

<xsl:template name="TestTemplate">
  <!-- the following expression emits true or false -->
  <xsl:value-of select="
    count(//RootNode/LeafNode[@Type='ABC']) gt; 0
  " />
</xsl:template>

最后两个提示:

  • 不惜一切代价避开'//'运营商。大部分时间都没有必要使用
  • 文档中第一个,最顶层的元素不是“根节点”,它是“文档元素”

这是一个重要的区别。 “根节点”在文档元素之前出现,因此上面的XPath应该更像这样(语义上):

/DocumentElement/LeafNode
^------ *this* slash represents the "root node"

答案 1 :(得分:0)

ad 1.我认为这是不可能的,但我不确定

ad 2.是的,您可以使用参数但要注意它,因为它是常量。 XSL中的所有变量和参数都是常量。看W3School - variable

举:

  

设置变量值后,您无法更改或修改该值!

参数也一样。

您可以使用(常量)参数调用模板:

<call-template name="myTemplate">
   <xsl:with-param name="name" select="expression">
</call-template>

看看W3School - with parameter这是非常好的参考页面。