在XSLT中使用foreach进行迭代

时间:2016-09-30 06:17:46

标签: xml xslt

我在XML中有一些标签:

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

目前我只从order {1的<Process>标签中获取一个值,我想根据顺序迭代所有名称(countryList xml标签中的整数值)。因为我应该根据订单价值获得美国,英国,印度。说起初订单是&#39; 1&#39;它应该取得美国&#39;然后订单价值增加1然后它应该得到英国&#39;等等。
我试过下面的代码:

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

但是对我不起作用。对它有任何帮助吗?

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分: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

输入元素的顺序维持。

结果,如果您设置'initial = 2'

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

编辑1(见下面的评论)

我认为你根本不需要迭代。您可以直接通过Xpath进行选择。见这里:

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

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