我在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'"><ok to="<xsl:value-of select="@name"/>"></xsl:if>
</xsl:for-each>
<xsl:text>
</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'"><ok to="<xsl:value-of select="@name"/>"></xsl:if>
</xsl:for-each>
<xsl:variable name="aggregationOrder" select="$aggregationOrder + 1"/>
<xsl:text>
</xsl:text>
</xsl:if>
但是对我不起作用。对它有任何帮助吗?
答案 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 >= $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>