2011-11-14 13 views
8

Estoy tratando de declarar una variable que tiene un valor predeterminado o si un valor está presente en un conjunto repetitivo para usar un nuevo valor diferente.XSLT valor de variable predeterminado si el valor no está presente

Esto es lo que tengo hasta ahora.

 <xsl:variable name="lsind"> 
     <xsl:value-of select="'N'"/> 

     <xsl:for-each select='./Plan/InvestmentStrategy/FundSplit'> 
      <xsl:choose> 
      <xsl:when test="contains(./@FundName, 'Lifestyle')"> 
       <xsl:value-of select="'Y'"/> 
      </xsl:when> 
      </xsl:choose> 
     </xsl:for-each> 
     </xsl:variable> 

Lo que quiero decir, si todas las instancias de ./Plan/InvestmentStrategy/FundSplit/@FundName 'contiene' estilo de vida entonces lsind 'Y' de lo contrario se cae de nuevo al valor por defecto de 'N'.

Lo estoy haciendo de esta manera como si utilizo 'de lo contrario, la última ocurrencia podría volver a poner lsind en N?

¿Alguna sugerencia?

Respuesta

12
<xsl:variable name="lsind"> 
    <xsl:choose> 
    <xsl:when test="Plan/InvestmentStrategy/FundSplit[contains(@FundName, 'Lifestyle')]"> 
     <xsl:text>Y</xsl:text> 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:text>N</xsl:text> 
    </xsl:otherwise> 
    </xsl:choose> 
</xsl:variable> 

debería ser suficiente

+1

Usted es un ser humano hermoso. ¡Gracias! Estaba empezando a explorar la ruta xpath sospechando que debe haber una manera. –

4

Esto puede especificarse en una sola expresión XPath (incluso en XPath 1.0):

<xsl:variable name="vLsind" select= 
"substring('YN', 
      2 - boolean(plan/InvestmentStrategy/FundSplit[@FundName='Lifestyle']), 
      1)"/> 

Ejemplo 1:

<plan> 
<InvestmentStrategy> 
    <FundSplit FundName="Lifestyle"/> 
</InvestmentStrategy> 
</plan> 

Transformación:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:variable name="vLsind" select= 
"substring('YN', 
      2 - boolean(plan/InvestmentStrategy/FundSplit[@FundName='Lifestyle']), 
      1)"/> 

<xsl:template match="/"> 
    <xsl:value-of select="$vLsind"/> 
</xsl:template> 
</xsl:stylesheet> 

Resultado:

Y 

Ejemplo 2:

<plan> 
<InvestmentStrategy> 
    <FundSplit FundName="No Lifestyle"/> 
</InvestmentStrategy> 
</plan> 

Resultado:

N 

Explicación:

  1. Por definición boolean(some-node-set) es true() exactamente cuando some-node-set es no vacío.

  2. Por definición number(true()) es 1 y number(false()) es 0

  3. 1 y 2 cobined nos da: number(boolean(some-node-set)) es 1 exactamente cuando some-node-set es no vacío, de lo contrario es 0.

Otras soluciones de una sola expresión:

XPath 1.0:

translate(number(boolean(YourXPathExpression)), '10', 'YN') 

XPath 2.0:

if(YourXPathExpression) 
then 'Y' 
else 'N' 

O incluso:

('N', 'Y')[number(boolean(YourXPathExpression)) +1] 
+0

+1 ¡Estos son algunos maravillosos ejemplos de (mis) usos de las funciones de XPath 1.0! – Goran

+4

@Goran: ¿Esto fue declarado por el departamento de policía? Si * este * es un uso incorrecto, entonces estoy en un problema mucho más grande ... :) –

+0

@DimitreNovatchev. No es un uso indebido, pero puede ser muy obtuso, porque enmascara una construcción lógica dentro de una expresión, lo que puede no ser bueno para el mantenimiento a largo plazo, ya que la mayoría, o quien viene después de ellos, puede necesitar tratar de obtener su cabeza a su alrededor cada vez que lo vuelven a visitar. – Patanjali

Cuestiones relacionadas