如何打破for-each循环XSLT?(How to break XSLT for-each loo

2019-10-20 06:55发布

我知道休息是不可能的XSLT for-each循环。 但是,从下面的例子中,如果我想要展示“东西”元素存在与否。 然后,我将通过循环,一旦我得到了它,我想打破循环。

  1. 我会让一个布尔变量说ISEXIST = FALSE;
  2. 我将通过一个经过的所有节点之一。
  3. 一旦我得到了“东西”,我将其值改为ISEXIST =真
  4. 希望在这里打破循环。

现在,我想打破循环bcoz我想显示状态为真或假。 但是,如果我不会第3步后用破,它会去循环,使之变成假的,我会得到假身份。

我的问题是:如果打破不可能的,那么如何实现这个结果呢?

我下面这个链接如何中断for-each循环不contiguos元素的XSLT?

根据这个链接,我会得到前两个发生,但它doen't说“东西”存在与否。

<root>
  <item/>
  <item/>
  <something/>
  <item/>
</root>

Answer 1:

这不是变量,XSLT是如何工作 - 变量总是词法范围包含他们的元素,一旦设置不能被改变。

你需要学习更多的声明认为,而不是程序上-告诉处理器你希望它找到,而不是你会怎么看它是什么 。 XPath表达式boolean(/root/something)会给你你想要的东西-如果有一个something元素作为的子root ,否则为假。



Answer 2:

如果你是后是否<something/>的存在与否,你也可以只使用检查

<xsl:if test="/root/something">
    // do fancy stuff...
</xsl:if>


Answer 3:

当你写一个元素选择器相匹配,例如XSLT模板:

<xsl:template match="entry"> .... </entry>

你有这样一个XML文件:

<entries>
    <entry number="345" type="A"/>
    <entry number="123" type="B"/>
    <entry number="334" type="A"/>
    <entry number="322" type="C"/>
</entries>

该XSLT模板将所有被处理entry元素 。 所以大多数的时候,你永远需要使用for-each在XSLT。 在上面的例子中,模板将被处理的4倍,由于有4层entry的元素相匹配。 里面每一个你可以提取或打印的可用在这方面(如属性,在这个例子中)的数据。

通常,您还可以执行许多条件表达式而没有使用<xsl:if><xsl:choose> ,通过限制您通过XPath的谓词所需要的。

如果添加另一个模板的entry有这样的断言元素:

<xsl:template match="entry[@type='A']"> .... </entry>

然后它将覆盖 entry 模板entry具有一个元素type与值属性A 。 其他人将通过没有谓语模板进行处理。

优先考虑这些工具,而不是for-eachifchoose ,将帮助您认为更实用化的方式,并了解如何更好地使用XSLT。

变量 params不能改变,你不能使用普通的for循环递增或递减的,但如果你需要一个,就可以写一个for循环,增加在XSLT 1.0变量,但是它必须完成递归(使用xsl:call-template )。 在这种策略中,你没有一个不同的值赋给一个变量,而是一个可变块将设置该变量的最终值执行操作。

参见,例如,这个样式表,其计算数的阶乘。 在每一递归的PARAM n具有其不改变,但是被用作用于在下一递归另一N PARAM数据的最终值:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="text"/>

    <xsl:param name="number">5</xsl:param>

    <xsl:template match="/">
        <xsl:variable name="fac">
            <xsl:call-template name="factorial">
                <xsl:with-param name="n" select="$number"/>
            </xsl:call-template>
        </xsl:variable>
        <xsl:value-of select="$fac"/>
    </xsl:template>

    <xsl:template name="factorial">
        <xsl:param name="n"/>
        <xsl:choose>
            <xsl:when test="$n &gt; 1">
                <xsl:call-template name="factorial">
                    <xsl:with-param name="n-1"/>
                </xsl:call-template>
                <xsl:value-of select="$n * $n - 1"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="1"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
</xsl:stylesheet>


文章来源: How to break XSLT for-each loop?
标签: xslt xslt-1.0