【问题标题】:Incrementing variable inside for-each在 for-each 中递增变量
【发布时间】:2015-09-25 11:13:37
【问题描述】:

当遇到一些 if 语句时,我需要制作某种标识符/标志。所以我只在 for-each 中写了一次<h2>(代码如下):

<xsl:for-each select="$matchedNodes">
    <xsl:variable name="i" select="0"/>
    <xsl:variable name="j" select="0"/>
    <xsl:if test="magazineDate != '' and (i &lt; 1)">
        <h2>Magasiner</h2>
        i++
    </xsl:if>

    <xsl:if test="homepageArticleDate != '' and (j &lt; 1)">
        <h2>Artikel</h2>
        j++
    </xsl:if>
</xsl:for-each>

我尝试过使用position(),但这不起作用,因为这两个属性都在$matchedNodes

$matchedNodes 由 umbraco 节点组成。

谁能看到这个问题的解决方案?我曾考虑过使用xsl:template,但我对 XSLT 有点陌生,所以我不知道从哪里开始。

【问题讨论】:

  • 允许使用布尔变量作为标志
  • 考虑向我们展示您想要创建的matchedNodes 输入节点和相应输出(HTML h2 元素?)的示例,然后我们可以向您展示实现该目标的XSLT 方式。跨度>
  • matchedNodes 由 umbraco 节点组成
  • 变量在 XSLT 中是“不可变的”,一旦设置就无法更改,因此您当前的方法行不通。要解决您的问题,我们确实需要查看输入 XML 和预期的输出 HTML,然后可以给出另一种方法。谢谢!

标签: xslt umbraco increment


【解决方案1】:

XSLT 和 XPath 是函数式语言。这意味着,一旦定义了变量的值,就无法更改变量。当然,还有一些替代解决方案,不需要改变任何变量——在许多方面,不变性是一种优越的语言特性,导致代码更易于理解和维护,并且允许比 OIL 更积极的优化(Old Imperative语言)。

一个解决方案可能如下所示

    <xsl:apply-templates select=
    "$matchedNodes/magazineDate[normalize-space()][1]
  |  $matchedNodes/homepageArticleDate[normalize-space()][1]" mode="heading"/>

然后在两个不同/单独的模板中(甚至可以尝试将它们统一到一个模板中):

<xsl:template match="magazineDate" mode="heading">
  <h2>Magasiner</h2>
</xsl:template>

<xsl:template match="homepageArticleDate" mode="heading">
  <h2>Artikel</h2>
</xsl:template>

【讨论】:

    猜你喜欢
    • 2011-10-15
    • 2013-12-17
    • 2013-04-14
    • 1970-01-01
    • 2017-01-26
    • 2014-01-02
    • 2020-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多