XSL For-each循环集变量

时间:2018-01-17 19:52:52

标签: xslt xslt-2.0 saxon

我知道XSL中的变量更像是其他语言中的常量,并且它们不能在操作中设置。但是,我需要遍历一个节点,计算子元素值,如果为true,则将该值设置为param或variable。一旦完成,我需要将这些参数传递给模板。我知道这不对,但是这样的事情:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">
    <xsl:template match="/">
        <xsl:for-each select="/person/address/address_line">
            <xsl:if test="type = 'local_script'">
                   <xsl:variable name="vADDRESS_LINE1" select="addressValue"/>
            </xsl:if>
        </xsl:for-each>
        <xsl:call-template name="FormatAddress">
            <xsl:with-param name="ADDRESS_LINE1" select="$vADDRESS_LINE1"></xsl:with-param>
        </xsl:call-template>
    </xsl:template>
    <xsl:template name="FormatAddress">
        <xsl:param name="ADDRESS_LINE1"></xsl:param>
            <!-- laydown formatted address in xml-->
    </xsl:template>

1 个答案:

答案 0 :(得分:1)

认为你要做的是将变量vADDRESS_LINE1绑定到最后一个具有type =&#39; local_script&#39;的地址线的addressValue值。

正确的方法是

<xsl:variable name="vADDRESS_LINE1" 
  select="/person/address/address_line[type='local_script'][last()]/addressValue"/>

如果只有一个address_line满足谓词,那么你可以省略[last()]