verifica del valore di una variabile all'interno di una variabile con precedenza superiore in XSLT
-
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)
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?