xml
  • xslt
  • 2012-04-17 8 views 13 likes 
    13

    ¿Cuál es la diferencia entre dos códigos dados a continuación? Ambos códigos verifica si existe un atributo en una etiqueta o no:Cuál es la diferencia entre los atributos XSLT cuando y si

    <xsl:choose> 
        <xsl:when test="string-length(DBE:Attribute[@name='s0SelectedSite']/node()) &gt; 0"> 
        <table> 
         ... 
        </table> 
        </xsl:when> 
        <xsl:otherwise> 
        <table> 
         ... 
        </table> 
        </xsl:otherwise> 
    </xsl:choose> 
    

    y

    <xsl:if test="@Col1-AllocValue"> 
        <xsl:copy-of select="@Col1-AllocValue"/> 
    </xsl:if> 
    

    Respuesta

    2

    El choose permite poner a prueba a varias condiciones y se aplican únicamente cuando uno coincide (o un caso por defecto). Con if puede probar también, pero se prueban de forma independiente y cada caja coincidente tendrá salida.

    Adición de más detalles (lo siento tenían que salir corriendo)

    choose permite poner a prueba para múltiples casos y sólo generar la salida en el caso de que una de las condiciones del partido, o generar un poco de salida por defecto. por ejemplo:

    <xsl:choose> 
        <xsl:when test='@foo=1'><!-- do something when @foo is 1--></xsl:when> 
        <xsl:when test='@foo=2'><!-- do something when @foo is 2--></xsl:when> 
        <xsl:when test='@foo=3'><!-- do something when @foo is 3--></xsl:when> 
        <xsl:otherwise><!-- this is the default case, when @foo is neither 1, 2 or 3--></xsl:otherwise> 
    </xsl:choose> 
    

    Como se puede ver uno de las "ramas" habrá tomarse en función del valor de @foo.

    Con if, que es una sola prueba y generar una salida en el resultado de la prueba:

    <xsl:if test='@foo=1'><!-- do this if @foo is 1--></xsl:if> 
    <xsl:if test='@foo=2'><!-- do this if @foo is 2--></xsl:if> 
    <xsl:if test='@foo=3'><!-- do this if @foo is 3--></xsl:if> 
    

    La complicación aquí es el caso fracaso - lo que sucede cuando no es ni @foo 1,2 o 3? Este caso perdido es lo que se maneja cuidadosamente en el choose, es decir, la capacidad de tener una acción predeterminada.

    XSL también carece de la "cosa" que se encuentran en la mayoría de los otros idiomas, que le permite proporcionar una acción alternativa si falla la prueba if - y una choose con una sola when y otherwise le permite obtener alrededor de este, pero en el ejemplo anterior, que sería horrible (para demostrar por qué no podría hacer esto ..)

    <xsl:choose> 
        <xsl:when test='@foo=1'><!-- do something when @foo is 1--></xsl:when> 
        <xsl:otherwise> <!-- else --> 
        <xsl:choose> 
         <xsl:when test='@foo=2'><!-- do something when @foo is 2--></xsl:when> 
         <xsl:otherwise> <!-- else --> 
         <xsl:choose> 
          <xsl:when test='@foo=2'><!-- do something when @foo is 2--></xsl:when> 
          <xsl:otherwise><!-- this is the case, when @foo is neither 1, 2 or 3--></xsl:otherwise> 
         </xsl:choose> 
         </xsl:otherwise> 
        </xsl:choose> 
        </xsl:otherwise> 
    </xsl:choose> 
    
    +0

    Necesita más explicación. –

    12

    Estructura de elegir es

    <xsl:choose> 
        <xsl:when test="a">A</xsl:when> 
        <xsl:when test="b">B</xsl:when> 
        <xsl:when test="c">C</xsl:when> 
        <xsl:when test="...">...</xsl:when> 
        <xsl:otherwise>Z</xsl:otherwise> 
    </xsl:choose> 
    

    que permite multipl Controles e y una operación que se realizará para la primera evaluación de prueba al true. xsl:otherwise es para realizar acciones predeterminadas cuando ninguna de las verificaciones se evalúa como true; en particular, esto facilita una construcción if-then-else (solo una opción xsl:when más un bloque xsl:otherwise).

    Siempre me sorprendió que xsl:if no permitía una alternativa xsl:else, pero como esto está disponible en xsl:choose construcción, supongo que no fue juzgado para añadirlo. Tal vez la próxima versión XSLT incorporará un xsl:else?

    Por lo demás, las pruebas en xsl:when y en xsl:if hacen exactamente lo mismo: verificar el estado.

    Tenga en cuenta que la estructura de xsl:if es simplemente

    <xsl:if test="a">A</xsl:if> 
    

    Una sola

    <xsl:when test="a">A</xsl:when> 
    

    sería válido: xsl:when elemento es siempre un niño de xsl:choose. Y xsl:choose pueden tener hijos xsl:when y xsl:otherwise solamente.

    1

    ¿Cuál es la diferencia entre dos códigos dados a continuación? Ambos códigos verifica si existe un atributo en una etiqueta o no:

    esto no es cierto:

    1. El primer fragmento de código expresa una si ... entonces ... else acción, mientras que el segundo fragmento expresa solo si ... acción.

    2. Las condiciones probadas en los dos fragmentos de código proporcionados - dentro de la instrucción xsl:when y dentro de las instrucciones xsl:if son diferentes. De hecho, solo el xsl:if (en el segundo fragmento de código) prueba la existencia de un atributo.

    Cuestiones relacionadas