我知道休息是不可能的XSLT for-each循环。 但是,从下面的例子中,如果我想要展示“东西”元素存在与否。 然后,我将通过循环,一旦我得到了它,我想打破循环。
- 我会让一个布尔变量说ISEXIST = FALSE;
- 我将通过一个经过的所有节点之一。
- 一旦我得到了“东西”,我将其值改为ISEXIST =真
- 希望在这里打破循环。
现在,我想打破循环bcoz我想显示状态为真或假。 但是,如果我不会第3步后用破,它会去循环,使之变成假的,我会得到假身份。
我的问题是:如果打破不可能的,那么如何实现这个结果呢?
我下面这个链接如何中断for-each循环不contiguos元素的XSLT?
根据这个链接,我会得到前两个发生,但它doen't说“东西”存在与否。
<root>
<item/>
<item/>
<something/>
<item/>
</root>
这不是变量,XSLT是如何工作 - 变量总是词法范围包含他们的元素,一旦设置不能被改变。
你需要学习更多的声明认为,而不是程序上-告诉处理器你希望它找到,而不是你会怎么看它是什么 。 XPath表达式boolean(/root/something)
会给你你想要的东西-如果有一个something
元素作为的子root
,否则为假。
如果你是后是否<something/>
的存在与否,你也可以只使用检查
<xsl:if test="/root/something">
// do fancy stuff...
</xsl:if>
当你写一个元素选择器相匹配,例如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-each
, if
和choose
,将帮助您认为更实用化的方式,并了解如何更好地使用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 > 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>