Programim dhe zhvillim, javascript, python, php, html

XSL: Si të modifikoni një variabël në një deklaratë if [duplicate]

në një transformim xsl, unë jam duke përdorur një sërë deklaratash if për të reaguar ndaj shfaqjeve të segmenteve në një dokument xml. Një për-secili nuk është i përshtatshëm në këtë situatë.

Sa herë që deklarata nëse është e vërtetë, 1 duhet të shtohet në numërues (i_prop + 1) dhe një segment me vlerën e numëruesit duhet të shtohet në dalje. Si në shembullin e mëposhtëm

POR duket se ndryshorja mund të modifikohet në deklaratën if, por jo në një mënyrë "globale". Pas deklaratës ndryshorja ka vlerën fillestare si më parë për deklaratën if.

A ka ndonjë mënyrë për të përdorur variablin e modifikuar në deklaratën e ardhshme if. Dhe pse xsl po bën këtë lloj gjëje?

XSL_INPUT:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">

<!-- Create variable -->
<xsl:variable name="i_prop" select="0"/>
<test><xsl:value-of select="$i_prop"/></test>

<!-- +1 global -->
<xsl:variable name="i_prop" select="$i_prop + 1"/>
<test><xsl:value-of select="$i_prop"/></test>
<!-- +1 global -->
<xsl:variable name="i_prop" select="$i_prop + 1"/>
<test><xsl:value-of select="$i_prop"/></test>

<!-- +1 in if | FALSE -->
<xsl:if test="'A' = 'X'"><testif1><xsl:value-of select="$i_prop"/></testif1></xsl:if>

<!-- +1 in if | TRUE -->
<xsl:if test="'A' != 'X'"><xsl:variable name="i_prop" select="$i_prop + 1"/><testif2><xsl:value-of select="$i_prop"/></testif2></xsl:if>
<!-- +1 in if | TRUE -->
<xsl:if test="'A' != 'X'"><xsl:variable name="i_prop" select="$i_prop + 1"/><testif3><xsl:value-of select="$i_prop"/></testif3></xsl:if>

<!-- +1 global -->
<xsl:variable name="i_prop" select="$i_prop + 1"/>
<test><xsl:value-of select="$i_prop"/></test>

<!-- +1 in if | TRUE -->
<xsl:if test="'A' != 'X'"><xsl:variable name="i_prop" select="$i_prop + 1"/><testif4><xsl:value-of select="$i_prop"/></testif4></xsl:if>
<!-- +1 in if | TRUE -->
<xsl:if test="'A' != 'X'"><xsl:variable name="i_prop" select="$i_prop + 1"/><testif5><xsl:value-of select="$i_prop"/></testif5></xsl:if>

</xsl:template>
</xsl:stylesheet>

dalja:

<test>0</test>
<test>1</test>
<test>2</test>
<testif2>3</testif2>
<testif3>3</testif3>
<test>3</test>
<testif4>4</testif4>
<testif5>4</testif5>

expected:

<test>0</test>
<test>1</test>
<test>2</test>
<testif2>3</testif2>
<testif3>4</testif3>
<test>5</test>
<testif4>6</testif4>
<testif5>7</testif5>

Faleminderit

Matias

27.04.2017

  • Fleta juaj e stilit është etiketuar version="1.0" por mund të funksionojë vetëm në XSLT 2.0. 27.04.2017

Përgjigjet:


1

Variablat janë të shtrirë në elementin e tyre prind. Kur ripërcaktoni (ose, më saktë, anashkaloni) një ndryshore brenda një instruksioni xsl:if, ai ekziston vetëm atje. Kur të ktheheni në nivelin më të lartë, do të gjeni variablin origjinal global, të pandryshuar.

Merrni parasysh fletën e stilit të mëposhtëm:

XSLT 2.0

<xsl:stylesheet version="2.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="/">
    <results>
        <!-- initial variable -->
        <xsl:variable name="i_prop" select="0"/>

        <test name="global">
            <xsl:value-of select="$i_prop"/>
        </test>

        <!-- redefine -->
        <xsl:variable name="i_prop" select="$i_prop + 1"/>
        <test name="redefine-global">
            <xsl:value-of select="$i_prop"/>
        </test>

        <!-- conditional redefine -->
        <xsl:if test="true()">
            <xsl:variable name="i_prop" select="$i_prop + 1"/>

            <test name="scoped to xsl:if">
                <xsl:value-of select="$i_prop"/>
            </test>
        </xsl:if>

        <test name="back to global">
            <xsl:value-of select="$i_prop"/>
        </test>
    </results>
</xsl:template>

</xsl:stylesheet>

Rezultati

<?xml version="1.0" encoding="UTF-8"?>
<results>
   <test name="global">0</test>
   <test name="redefine-global">1</test>
   <test name="scoped to xsl:if">2</test>
   <test name="back to global">1</test>
</results>
27.04.2017
Materiale të reja

Masterclass Coroutines: Kapitulli-3: Anulimi i korutinave dhe trajtimi i përjashtimeve.
Mirë se vini në udhëzuesin gjithëpërfshirës mbi Kotlin Coroutines! Në këtë seri artikujsh, unë do t'ju çoj në një udhëtim magjepsës, duke filluar nga bazat dhe gradualisht duke u thelluar në..

Faketojeni derisa ta arrini me të dhënat false
A e gjeni ndonjëherë veten duke ndërtuar një aplikacion të ri dhe keni nevojë për të dhëna testimi që duken dhe duken më realiste ose një grup i madh të dhënash për performancën e ngarkesës...

Si të përdorni kërkesën API në Python
Kërkesë API në GitHub për të marrë depot e përdoruesve duke përdorur Python. Në këtë artikull, unë shpjegoj procesin hap pas hapi për të trajtuar një kërkesë API për të marrë të dhëna nga..

Një udhëzues hap pas hapi për të zotëruar React
Në këtë artikull, do të mësoni se si të krijoni aplikacionin React, do të mësoni se si funksionon React dhe konceptet thelbësore që duhet të dini për të ndërtuar aplikacione React. Learning..

AI dhe Psikologjia — Pjesa 2
Në pjesën 2 të serisë sonë të AI dhe Psikologji ne diskutojmë se si makineritë mbledhin dhe përpunojnë të dhëna për të mësuar emocione dhe ndjenja të ndryshme në mendjen e njeriut, duke ndihmuar..

Esencialet e punës ditore të kodit tim VS
Shtesat e mia të preferuara - Git Graph 💹 Kjo shtesë është vërtet e mahnitshme, e përdor përpara se të filloj të punoj për të kontrolluar dy herë ndryshimet dhe degët më të fundit, mund të..

Pse Python? Zbulimi i fuqisë së gjithanshme të një gjiganti programues
Në peizazhin gjithnjë në zhvillim të gjuhëve të programimit, Python është shfaqur si një forcë dominuese. Rritja e tij meteorike nuk është rastësi. Joshja e Python qëndron në thjeshtësinë,..