verifica del valore di una variabile all'interno di una variabile con precedenza superiore in XSLT

StackOverflow https://stackoverflow.com/questions/400909

  •  03-07-2019
  •  | 
  •  

Domanda

Devo essere in grado di verificare che cosa " corrente " il valore di una variabile è all'interno di una redeclaration della stessa variabile in una xslt diversa che include l'altra.

main.xslt:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:import href="other.xslt"/>
    <xsl:variable name="email">
        <xsl:if test="string-length($email) = 0">
            bar@foo.com
        </xsl:if>
    </xsl:variable>
    <xsl:template match="/">
        <Email>
            <xsl:value-of select="$email"/>
        </Email>
    </xsl:template>
</xsl:stylesheet>

other.xslt:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:variable name="email">foo@bar.com</xsl:variable>
</xsl:stylesheet>

Quello che vorrei fare è poter verificare quale sarà il valore della variabile con precedenza inferiore per vedere se devo sovrascriverlo nella variabile nell'attuale xslt. (dichiarazione di non responsabilità - il codice attuale si blocca viziosamente)

È stato utile?

Soluzione

Come altri hanno notato, l'aggiunta di un valore predefinito a una variabile globale definita in un foglio di stile importato non può essere eseguita utilizzando lo stesso nome di variabile . Questo perché la variabile con quel nome che è definita nel foglio di stile xslt corrente ha una precedenza maggiore rispetto a quella nel foglio di stile importato e verrà utilizzata solo la prima (non è possibile accedere alla variabile con nome identico nel foglio di stile con precedenza inferiore).

Ecco come si può aggiungere un valore predefinito :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!--                                            -->
  <xsl:import href="other.xsl"/> 
<!--                                            -->
    <xsl:variable name="vMyEmail" select=
     "concat(substring('bar@foo.com', 1 div not($vEmail)), $vEmail)"
     />
<!--                                            -->
    <xsl:template match="/">
      <xsl:value-of select="$vMyEmail"/>
    </xsl:template>
</xsl:stylesheet>

Nota che la variabile globale $vMyEmail è definita in modo tale da avere il valore della variabile < code> $ vEmail (definito nel foglio di stile importato) se si tratta di una stringa con lunghezza almeno 1 o del valore predefinito desiderato, altrimenti.

Usando questa tecnica, si utilizzerà il $ vMyEmail così definito in qualsiasi punto della sua definizione. La variabile $ vEmail dal foglio di stile importato non verrà utilizzata direttamente direttamente .

Altri suggerimenti

Non puoi fare direttamente quello che vuoi, dovresti impostare una seconda variabile.

Ma non riesco a capire l'intento: se questo fosse basato su template potresti fornire un valore predefinito a qualsiasi parametro (che agisce in modo molto simile alle variabili). Il modo in cui pronunci la domanda suggerisce che è l'approccio giusto per me, ma puoi chiarire in che modo questi modelli sono collegati e utilizzati?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top