Compruebe si una cadena es nula o está vacía en XSLT

¿Cómo puedo verificar si un valor es nulo o está vacío con XSL ?

Por ejemplo, si categoryName está vacío? Estoy usando a cuando elijo construir.

Por ejemplo:

         

     test="categoryName != ''" 

    Editar : Esto cubre la interpretación más probable, en mi opinión, de “[no] nula o vacía” como se deduce de la pregunta, incluido su pseudocódigo y mi propia experiencia anterior con XSLT. Es decir, “¿Cuál es el equivalente de la siguiente Java?”:

     !(categoryName == null || categoryName.equals("")) 

    Para más detalles, por ejemplo, identificando claramente nulo vs. vacío, vea la respuesta de johnvey a continuación y / o el ‘violín’ XSLT que he adaptado de esa respuesta, que incluye la opción en el comentario de Michael Kay y la sexta interpretación posible.

    Ausente de cualquier otra información, asumiré el siguiente XML:

       item 1 blue   item 2    item 3  ...  

    Un caso de uso de muestra se vería así:

                   

    Del elemento vacío :

    Para probar si el valor de un determinado nodo está vacío

    Depende de lo que quieras decir con vacío.

    • No contiene nodos hijo: not(node())
    • No contiene contenido de texto: not(string(.))
    • No contiene ningún texto que no sea el espacio en blanco: not(normalize-space(.))
    • No contiene nada, excepto los comentarios: not(node()[not(self::comment())])

    ¿Qué pasa?

     test="not(normalize-space(categoryName)='')" 

    Los primeros dos tratan con valor nulo y los segundos tratan con cadena vacía.

      USERNAME is not null   USERNAME is null   USERNAME is empty string   USERNAME is not empty string  

    En algunos casos, es posible que desee saber cuándo el valor es específicamente nulo, lo cual es particularmente necesario cuando se utiliza XML que se serializó desde objetos .NET. Si bien la respuesta aceptada funciona para esto, también devuelve el mismo resultado cuando la cadena está en blanco o vacía, es decir, ”, por lo que no puede diferenciar.

       item 1    

    Entonces puedes simplemente probar el atributo.

      Hello World.  

    A veces es necesario conocer el estado exacto y no se puede simplemente verificar si se crea una instancia de CategoryName, porque a diferencia de decir Javascript

      Hello World.  

    Devolverá verdadero para un elemento nulo.

    Sé que esta pregunta es antigua, pero entre todas las respuestas, echo de menos una que es un enfoque común para este caso de uso en el desarrollo de XSLT.

    Me estoy imaginando que el código que falta en el OP parece algo como esto:

               

    Y que la entrada se ve así:

       Books   Magazines Periodicals Journals          

    Es decir, supongo que puede haber cero, vacío, uno o varios elementos categoryName . Manejar todos estos casos utilizando construcciones xsl:choose style, o en otras palabras, imperativamente, se está volviendo desordenado rápidamente (¡aún más si los elementos pueden estar en niveles diferentes!). Una expresión de progtwigción típica en XSLT es el uso de plantillas (de ahí la T en XSLT), que es una progtwigción declarativa, no imprescindible (no le dice al procesador qué hacer, simplemente diga lo que quiere que se emita si se cumplen ciertas condiciones). Para este caso de uso, puede parecerse a lo siguiente:

           Category: Other    Category:    

    Esto funciona (con cualquier versión XSLT), porque el primero tiene una precedencia más alta (tiene un predicado). La plantilla de coincidencia “fall-through”, la segunda, capta todo lo que no sea válido. El tercero se encarga de generar el valor de categoryName manera adecuada.

    Tenga en cuenta que en este escenario no es necesario que coincida específicamente categories o category , ya que el procesador procesará automáticamente todos los elementos secundarios, a menos que le indiquemos lo contrario (en este ejemplo, la segunda y tercera plantilla no procesan más los elementos secundarios, ya que no xsl:apply-templates en ellos).

    Este enfoque es más fácilmente extensible que el enfoque imperativo, ya que trata automáticamente con múltiples categorías y se puede ampliar para otros elementos o excepciones simplemente agregando otra plantilla coincidente. Progtwigción sin if-branches .

    Nota: no existe tal cosa como null en XML. Hay xsi: nil , pero eso rara vez se usa, especialmente en escenarios sin tipo sin un esquema de algún tipo.

    Si existe la posibilidad de que el elemento no exista en el XML, probaría que el elemento está presente y que la longitud de la cadena es mayor que cero:

             

    Si un nodo no tiene ningún valor disponible en el xml de entrada, como debajo de xpath,

        

    La función string () se convierte en un valor vacío. Así que esto funciona bien:

     string(/Node/ErrorCode) ='' 

    Algo como esto funciona para mí:

       -      

    O al revés:

          -   

    Nota: Si no verifica valores nulos o maneja valores nulos, IE7 devuelve -2147483648 en lugar de NaN.

    ¿Cómo puedo verificar si un valor es nulo o está vacío con XSL?

    Por ejemplo, si categoryName está vacío?

    Esta es probablemente la expresión XPath más simple (la de la respuesta aceptada proporciona una prueba de lo contrario, y sería más larga, si se negara):

     not(string(categoryName)) 

    Explicación

    El argumento para la función not() anterior es false() exactamente cuando no hay categoryName child (“null”) del elemento de contexto, o el ( categoryName individual) categoryName child tiene valor de cadena – la cadena vacía.

    Estoy usando a cuando elijo construir.

    Por ejemplo:

             

    En XSLT 2.0 use :

      

    Aquí hay un ejemplo completo :

            

    Cuando se aplica esta transformación en el siguiente documento XML:

     X 

    el resultado deseado y correcto se produce :

     X 

    Cuando se aplica en este documento XML :

      

    o en esto:

      

    o en este

     Y 

    el resultado correcto es producido :

     Other 

    Del mismo modo, use esta transformación XSLT 1.0 :

            

    Tenga en cuenta : No se utilizan condicionales en absoluto. Aprenda más sobre la importancia de evitar construcciones condicionales en este curso agradable de Pluralsight:

    Patrones de diseño táctico en .NET: flujo de control

    Según mi experiencia, la mejor manera es:

           

    Use simple categoryName / text () Tal prueba funciona bien en y también .

             

    De hecho, me pareció mejor simplemente probar la longitud de la cuerda ya que muchas veces el campo no es nulo, solo vacío