如何在每个循环的另一个循环中访问在for-each循环/ If条件下定义的变量

时间:2019-04-11 09:26:50

标签: xslt-2.0

我必须按顺序生成输出,所以我想知道如何访问在For-each循环/ If条件下定义的变量,然后在另一个for循环内访问select的值。

按照我的示例,如何访问partn和date3?请帮助和建议。 实现相同目标的概念是什么。.我也尝试过使用param,但是对我没有用。

XSLT:

     <?xml version="1.0" encoding="UTF-8"?>

    <xsl:stylesheet version="2.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  xmlns:func="myfunc" 
 xmlns:xs="http://www.w3.org/2001/XMLSchema" 
   xmlns:fn="http://www.w3.org/2005/xpath-functions" >
<xsl:output method="text" encoding="utf-8" />
<xsl:output omit-xml-declaration="yes" />
<xsl:param name="break" select="'&#xA;'" />
      <xsl:template match="ZGS/ID">
    <xsl:for-each select="E1">   
        <xsl:if test="PA = 'CE'">
            <xsl:variable name="partn" select="PAN"/>
        </xsl:if>
    </xsl:for-each>
    <xsl:for-each select="E13">   
        <xsl:if test="ID = 033">
            <xsl:variable name="date3" 
     select="substring(DAT,3,8)"/>
        </xsl:if>
    </xsl:for-each>
    <xsl:for-each select="E1E">
        <xsl:text>823</xsl:text>
        <xsl:text>03</xsl:text>
        <xsl:for-each select="E1ED">
            <xsl:if test="QU = 012 ">
                <xsl:value-of select="BEL"/>  
            </xsl:if>
        </xsl:for-each>
        <xsl:value-of select="$partn"/>
        <xsl:value-of select="$date3"/>
    </xsl:for-each>
</xsl:template>

输入:

     <?xml version='1.0' encoding='utf-8'?>
    <ZGS>
  <ID BEGIN="1">
<E1 SEGMENT="1">
    <PA>AG</PA>
    <NAME>ABC</NAME>
    <SP>E</SP>
    <AND>0004</AND>
</E1>
<E1 SEGMENT="1">
    <PA>RE</PA>
    <PAN>IUIOP</PAN>
    <NAME>ABC1</NAME>
    <SP>EQ</SP>
    <AND>0005</AND>
    <EKA3 SEGMENT="1">
     <QU>009</QU>
    </EKA3>
</E1>
<E1 SEGMENT="1">
    <PA>CE</PA>
    <PAN>PODW</PAN>
    <NAME>ABC2</NAME>
    <SP>EP</SP>
    <AND>0006</AND>
</E1>
<E13 SEGMENT="1">
    <ID>001</ID>
    <DAT>20190329</DAT>
</E13>
<E13 SEGMENT="1">
    <ID>002</ID>
    <DAT>20190429</DAT>
</E13>
<E13 SEGMENT="1">
    <IDD>033</IDD>
    <DAT>20190529</DAT>
</E13>
<E1E>
<E1ED>
</E1ED>
<E1ED>
</E1ED>
</E1E>

   

1 个答案:

答案 0 :(得分:1)

在XSLT中,变量一旦声明/定义,就无法更改。并且仅存在于定义的循环中。

您可能不需要这里的xsl:for-each循环。而是可以全局定义变量,以便您可以在xslt中所需的位置使用它们。

您可以尝试以下操作:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:func="myfunc"
xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions">

<xsl:output method="text" encoding="utf-8" />
<xsl:output omit-xml-declaration="yes" />
<xsl:param name="break" select="'&#xA;'" />

<xsl:variable name="partn" select="/ZGS/ID/E1[PA = 'CE']/PAN" />
<xsl:variable name="date3" select="substring(/ZGS/ID/E13[ID = '033']/DAT,3,8)" />

<xsl:template match="ZGS/ID">
    <xsl:for-each select="E1E">
        <xsl:text>823</xsl:text>
        <xsl:text>03</xsl:text>

        <xsl:for-each select="E1ED">
            <xsl:if test="QU = 012 ">
                <xsl:value-of select="BEL" />
            </xsl:if>
        </xsl:for-each>

        <xsl:value-of select="$partn" />
        <xsl:value-of select="$date3" />
    </xsl:for-each>
</xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty-development.net/jyRYYiu

使用xsl:param,可以实现为

<xsl:param name="partn" select="/ZGS/ID/E1[PA = 'CE']/PAN" />
<xsl:param name="date3" select="substring(/ZGS/ID/E13[ID = '033']/DAT,3,8)" />

<xsl:template match="ZGS/ID">
    <xsl:for-each select="E1E">
        <xsl:text>823</xsl:text>
        <xsl:text>03</xsl:text>

        <xsl:for-each select="E1ED">
            <xsl:if test="QU = 012 ">
                <xsl:value-of select="BEL" />
            </xsl:if>
        </xsl:for-each>

        <xsl:for-each select="$partn">
            <xsl:value-of select="." />
        </xsl:for-each>

        <xsl:value-of select="$date3" />
    </xsl:for-each>
</xsl:template>

https://xsltfiddle.liberty-development.net/jyRYYiu/1