Как получить доступ к переменной, определенной в цикле for-each / If условие в другом для каждого цикла - PullRequest
0 голосов
/ 11 апреля 2019

Мне нужно сгенерировать выходные данные в последовательности, и поэтому я хотел знать, как получить доступ к переменной, определенной в условии For-each loop / If, а затем к значению select внутри другого цикла for.

Согласно моемупример, как получить доступ к 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 Ответ

1 голос
/ 11 апреля 2019

В 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

...