Xslt 每个循环集变量的XSL

Xslt 每个循环集变量的XSL,xslt,xslt-2.0,saxon,Xslt,Xslt 2.0,Saxon,我知道XSL中的变量更像其他语言中的常量,它们不能在操作内部设置。但是,我需要遍历一个节点,计算一个子元素值,如果为true,则将该值设置为参数或变量。完成后,我需要将这些参数传递到模板中。我知道这是不对的,但有点像这样: <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.

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

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

我认为您要做的是将变量vADDRESS\u LINE1绑定到最后一个addressLine的addressValue,该addressLine的类型为'local\u script'

正确的方法是

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


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

为什么您认为需要“循环”并调用模板?你需要实现什么样的转变?你为什么不把这个值推到一个匹配的模板上,比如
,然后把你的
?我对XSL很陌生,我的头脑很难摆脱传统的编程策略。我之所以调用look,是因为/person/address/address\u行可以有多个实例。一个代表zipecode,一个代表国家,一个代表州,一个代表地址,等等。我需要遍历所有地址行并计算每行的“type”元素。如果该类型元素符合我的需要,那么我需要获取地址值。一旦我有了某一类型的所有地址行的所有地址值,那么我必须将它们传递给一个要格式化的模板。您可能需要编辑您的问题,并向我们展示一些示例输入数据,并解释在该模板中需要哪些数据。您希望该参数具有什么样的数据类型和值,一系列元素?很难从不起作用且不可能起作用的代码中对规范进行反向工程。您基本上是用一种不存在的语言编写代码的,希望我们能够解决如果该语言确实存在的话它会做什么。@MichaelKay-很公平。正如我所说,我对xsl不太了解,只是偶尔接触一下。让我仔细考虑你下面的答案,看看它是否适合我的解决方案