2014-12-04 84 views
0

我有我需要用来创建货币对的货币代码列表。下面是一个(简化)例如在XSLT中创建嵌套循环

<?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,欧元兑美元, EURBRL,欧元兑英镑(你的想法)

我可以循环的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> 

如果我在中间添加第二个,我会这样做没有得到任何输出。我在这里搜索,但没有看到任何相关的东西。我试图让一些东西允许添加更多的货币代码(如日元,瑞士法郎,泰铢),而无需手动创建配对/笛卡儿产品(这正是我现在所做的)

谢谢!

回答

0

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

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> 
+0

完美!这样可行。非常感谢你。我不确定我在做什么,这是不可见的。我有嵌套循环工作 – Jay 2014-12-04 22:45:02