【问题标题】:Creating a recursive XSL:If statement?创建递归 XSL:If 语句?
【发布时间】:2009-06-19 04:32:08
【问题描述】:

我正在尝试设置一个 XSL:IF 语句,该语句仅显示具有介于两个值之间的节点的条目。很简单,对吧?这只是一个 if 大于和 if 小于。问题是,我需要针对最多 52 个节点对其进行测试,而不是针对一个节点进行测试。

假设我有一些如下所示的 XML:

<container>
    <entry>
        <item>1</item>
        <item>2</item>
        <item>3</item>
        <item>4</item>
        <item>5</item>
        <item>6</item>
        <item>7</item>
        <item>8</item>
        <item>9</item>
        <item>10</item>
    </entry>
</container>

现在假设我的范围是 9-15。因为某些节点属于该范围,所以我想显示该条目。但是,如果给我一个 11-15 的范围,则没有一个节点适合,所以我不希望它显示。

问题是……我完全不知道你会怎么做。我知道您可以使用单个值,但我想不出一种简单的方法来测试每个节点。

顺便说一句,这一切都是在 Symphony CMS 的最新稳定版本中完成的。

[编辑] 前两个结果的问题是它们显示 ITEM 节点,我正在寻找的是仅返回具有至少一个匹配的 ITEM 节点的 ENTRY 节点。我不确定任何解决方案如何对此有所帮助。

【问题讨论】:

    标签: xml xslt recursion symphony-cms


    【解决方案1】:

    您可以使用 &lt;entry&gt; 匹配的嵌套谓词来完成此操作:

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
        <xsl:template match="/">
            <xsl:for-each select="container/entry[item[number(.) &gt;= 9 and number(.) &lt;= 15]]">
                <!-- this will loop over <entry>s which contain <item>s within your range -->
            </xsl:for-each>
        </xsl:template>
    </xsl:stylesheet>
    

    该表达式将读作“包含值介于 9 和 15 之间的项目的条目”。

    【讨论】:

      【解决方案2】:
      <?xml version="1.0" encoding="UTF-8"?>
      <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
          <xsl:template match="/">
              <xsl:copy-of select="container/entry/item[number(.) &gt;= 9 and number(.) &lt;= 15]"/>
          </xsl:template>
      </xsl:stylesheet>
      

      XPath 语句 'container/entry/item' 引用所有匹配项。谓词 [number(.) >= 9 and number(.)

      <?xml version="1.0" encoding="UTF-8"?>
      <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
          <xsl:template match="/">
              <xsl:for-each select="container/entry/item[number(.) &gt;= 9 and number(.) &lt; 15]">
                  <xsl:value-of select="."/>
              </xsl:for-each>
          </xsl:template>
      </xsl:stylesheet>
      

      【讨论】:

      • @steamer25:就是这样,+1。 @dougoftheabaci:每当您在 XPath 中看到方括号时,最好想到“WHERE”(就像在 SQL 中一样)。在此解决方案中,XPath 可以翻译为“从容器/条目中选择项目,其中值 >= 9 且值
      【解决方案3】:

      这个怎么样....你可以在 for-each 循环中做任何你想做的事情,或者你可以只取变量中返回的节点集并在其他地方使用它。

         <?xml version='1.0'?>
          <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
          <xsl:template match="/">
              <!-- Your first param -->
              <xsl:param name="Param1" select="4"/>
              <!-- Your second param -->
              <xsl:param name="Param2" select="9"/>
                  <xsl:variable name="ResultNodeSet">
                      <xsl:for-each select="/container/entry/item[number(.) &gt;= $Param1 and number(.) &lt;= $Param2]">
                        <!-- What ever else you want to do can go here-->
                        <xsl:copy-of select="."/>
                      </xsl:for-each>
                  </xsl:variable>  
              <xsl:value-of select="$ResultNodeSet"/>
          </xsl:template> 
          </xsl:stylesheet>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-12-22
        • 1970-01-01
        • 2017-04-17
        • 2010-10-30
        • 1970-01-01
        • 1970-01-01
        • 2013-07-06
        相关资源
        最近更新 更多