2016-09-30 59 views
-2

的foreach我有幾個標籤XML:迭代與XSLT

<Process name="list-of-values" order="2"> 
    <CountryList name="USA" order="1" /> 
    <CountryList name="UK" order="2" /> 
    <CountryList name="INDIA" order="3" /> 
</Process> 

和XSL文件包含以下模板:

<xsl:for-each select="/Processes/Process/CountryList"> 
    <xsl:variable name="aggregationOrder" select="@order"/> 
    <xsl:if test="$aggregationOrder='1'">&lt;ok to="<xsl:value-of select="@name"/>"&gt;</xsl:if> 
</xsl:for-each> 
<xsl:text>&#xa;</xsl:text> 
</xsl:if> 

目前,我從我的訂單<Process>標籤讀取只有一個值= 1,我想根據順序迭代所有名稱(countryList xml標記中的整數值)。因爲我應該獲得美國,英國,印度的訂單價值。假設最初訂單是'1',它應該取得'美國',然後訂單價值增加1,那麼它應該得到'英國'等等。
我曾嘗試下面的代碼:

<xsl:for-each select="Processes/Process/CountryList"> 
    <xsl:variable name="aggregationOrder" select="@order"/> 
    <xsl:if test="$aggregationOrder='1'">&lt;ok to="<xsl:value-of select="@name"/>"&gt;</xsl:if> 
</xsl:for-each> 
<xsl:variable name="aggregationOrder" select="$aggregationOrder + 1"/> 
<xsl:text>&#xa;</xsl:text> 
</xsl:if> 

但對我來說沒有工作。對此有幫助嗎?

+1

你的問題不明確。這聽起來像你想要**排序** CountryList'節點的訂單屬性?什麼是輸出標記爲文本的處理?你在這裏預期的結果是什麼? –

+1

你的'for-each'和'if'標籤重疊,我不認爲這個樣式表甚至會運行。 –

+0

@ michael。hor257k我不想對它們進行排序,我想根據順序獲取每個名稱。 –

回答

2

考慮下面的例子中輸入(這是從你自己的略有不同,以證明原理):

XML

<Process name="list-of-values" order="2"> 
    <CountryList name="INDIA" order="3" /> 
    <CountryList name="USA" order="1" /> 
    <CountryList name="UK" order="2" /> 
</Process> 

以下樣式:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

<xsl:template match="/Process"> 
    <output> 
     <xsl:for-each select="CountryList"> 
      <xsl:sort select="@order" data-type="number" order="ascending"/> 
       <country> 
        <xsl:value-of select="@name"/> 
       </country> 
     </xsl:for-each> 
    </output> 
</xsl:template> 

</xsl:stylesheet> 

將返回:

<?xml version="1.0" encoding="UTF-8"?> 
<output> 
    <country>USA</country> 
    <country>UK</country> 
    <country>INDIA</country> 
</output> 
+0

michael.hor257k,感謝您的幫助。那就是我想要的,有沒有什麼方法可以像java中的順序++那樣增加訂單的價值。 –

+0

你爲什麼需要這個? –

+0

因爲我一次只想要一個國家,而在下一次迭代中,一旦訂單整數值爲'2',它會給'英國' –

1

XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:template match="/Process"> 
     <root> 
      <xsl:variable name="initial" select="1"/> 
      <!-- alternativ: 
       <xsl:variable name="initial" select="@order"/> <- this selects the attr. "order" of element "Process" 
      --> 
      <xsl:for-each select="CountryList[@order &gt;= $initial]"> 
       <ok to="{@name}"/> 
      </xsl:for-each> 
     </root> 
    </xsl:template> 

</xsl:stylesheet> 

說明:

可以設置變量initial到你的啓動值。循環開始並搜索CountryList,該屬性order大於或等於變量initial。輸出將是一個元素ok與attr to

輸入元素的順序保持。

因此,如果你設置`初始= 2'

<root><ok to="UK"/><ok to="INDIA"/></root> 

EDIT 1(見下文評論)

我覺得你並不需要在所有的迭代。您可以直接通過Xpath進行選擇。在這裏看到:

<xsl:template match="/Process"> 
    <xsl:apply-templates select="CountryList[@order=2]"/> 
</xsl:template> 

<xsl:template match="CountryList"> 
    <ok to="{@name}"/> 
</xsl:template> 
+0

感謝您的幫助,我一次只需要一個國家。 說的最初是1:所以它會給我。 當初始值遞增到'2'時,它會給我 ,依此類推。 我不想一次去所有的國家 –

+0

看到我的編輯回答 – uL1

+0

但它會給我的國家名稱與秩序'2',我是嗎? 不能把oder的值增加到1.就像order + 1,這樣當下一次迭代到來時,它會給我3的順序的國家名稱。 –