在XSLT中创建一个嵌套循环

时间:2014-12-04 18:00:14

标签: xml xslt nested-loops cartesian-product

我有一个货币代码列表,我需要用它来创建货币对。以下是(简化)示例

<?xml version="1.0" encoding="UTF-8"?>
 <CurrencyLists>
  <Currency>USD</Currency>
  <Currency>BRL</Currency>
  <Currency>EUR</Currency>
  <Currency>GBP</Currency>
 </CurrencyLists>

我正在尝试将每种货币与其他货币相匹配,以创建一对(笛卡尔积)这样的货币 USDBRL,USDEUR,USDGBP,BRLUSD,BRLEUR,BRLGBP,EURUSD,EURBRL,EURGBP(你明白了)

我可以在xslt中循环并获取每个值,但我不确定如何第二次获取值 这是我的示例xslt代码

<xsl:template match="/">

    <CurrencyPairs>
     <Total>
         <xsl:value-of select="count(CurrencyLists/Currency)"></xsl:value-of>
     </Total>
    <xsl:for-each select="CurrencyLists/Currency">

    <!--<CurrencyPair><xsl:value-of select="."/></CurrencyPair>-->
        <xsl:variable name="first" select="."/>
        <first><xsl:value-of select="$first"/></first>

       <!-- nested loop / cartesian here -->                


    </xsl:for-each>

    </CurrencyPairs>
</xsl:template>

如果我在中间添加一个for-each,我就不会得到任何输出。我在这里搜索但没有看到任何相关的东西。我正在尝试制作一些允许添加更多货币代码的东西(如JPY,CHF,THB),而无需手工创建成对/笛卡尔产品(这就是我现在正在做的)

谢谢!

2 个答案:

答案 0 :(得分:1)

你可以这么简单地做到这一点:

  <xsl:template match="/">
    <CurrencyPairs>
      <xsl:variable name="allCurrencies" select="CurrencyLists/Currency" />

      <Total>
        <xsl:value-of select="count($allCurrencies)"></xsl:value-of>
      </Total>

      <xsl:for-each select="$allCurrencies">
        <xsl:variable name="first" select="."/>

        <xsl:for-each select="$allCurrencies[. != $first]">
          <CurrencyPair>
            <First>
              <xsl:value-of select="$first" />
            </First>
            <Second>
              <xsl:value-of select="." />
            </Second>
          </CurrencyPair>
        </xsl:for-each>        
      </xsl:for-each>
    </CurrencyPairs>
  </xsl:template>

答案 1 :(得分:0)

for-each内,你当然可以拥有另一个绝对路径<xsl:for-each select="/CurrencyLists/Currency">或者相对于外部for-each的一个,例如<xsl:for-each select="../Currency">