¿Cómo puedo verificar si un valor es nulo o está vacío con XSL ?
Por ejemplo, si categoryName
está vacío? Estoy usando un al elegir la construcción.
Por ejemplo:
<xsl:choose>
<xsl:when test="categoryName !=null">
<xsl:value-of select="categoryName " />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="other" />
</xsl:otherwise>
</xsl:choose>
xsl:when
para pruebas de nodo. Considere<xsl:template match="Category[categoryName[not(node())]]">...
junto con a<xsl:template match="Category">...
. El procesador tomará las decisiones correctas por usted y ya no necesitará escribir la lógica de negocios en anidadoxsl:choose
. En muchos casos, el uso de plantillas coincidentes facilita la escritura de hojas de estilo.Respuestas:
Editar : Esto cubre la interpretación más probable, en mi opinión, de "[no] nulo o vacío" como se infiere de la pregunta, incluido su pseudocódigo y mi propia experiencia inicial con XSLT. Es decir, "¿Cuál es el equivalente de la siguiente Java?":
Para obtener más detalles, por ejemplo, identificar claramente nulo frente a vacío, consulte 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, así como la sexta interpretación posible.
fuente
test="not(categoryName = '')"
. La respuesta proporcionada devolverá falso si el elemento categoryName está ausente, lo que en mi interpretación de la pregunta hace que sea una respuesta incorrecta.<xsl:for-each select="root/*[matches(name(.), 'grp')]">
para que pueda usarse en VS2010?En ausencia de cualquier otra información, asumiré el siguiente XML:
Un ejemplo de caso de uso se vería así:
fuente
</CategoryName>
? , Pruebas de cadena vacía no funcionan para este</CategoryName>
, ni tampoco es necesario.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.
not(node())
not(string(.))
not(normalize-space(.))
not(node()[not(self::comment())])
fuente
not(text())
. Una alternativa a su segunda viñeta es tambiénnot(.//text())
. Como muestra su última viñeta: hay muchas formas de considerar la "nada";).if ($mystring) then ... else ...
¿Qué pasa?
fuente
<categoryName> <!-- some comment --> </categoryName>
y, de lo contrario, no hay texto significativo, esto todavía se evalúa comotrue
Los primeros dos tratan con un valor nulo y los segundos dos tratan con una cadena vacía.
fuente
xsl:apply-templates
y combine plantillas para obtener lo que desea, mucho más fácil.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 ha serializado a partir de 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.
Entonces puedes simplemente probar el atributo.
A veces es necesario saber el estado exacto y no puede simplemente verificar si se crea una instancia de CategoryName, porque a diferencia de decir Javascript
Devuelve verdadero para un elemento nulo.
fuente
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 imagino que el código faltante del OP se ve así:
Y que la entrada se ve así:
Es decir, supongo que puede haber cero, elementos vacíos, únicos o múltiples
categoryName
. Tratar todos estos casos usandoxsl:choose
construcciones de estilo, o en otras palabras, imperativamente, se está volviendo rápidamente desordenado (¡aún más si los elementos pueden estar en diferentes niveles!). Un lenguaje de programación típico en XSLT es usar plantillas (de ahí la T en XSLT), que es programación declarativa, no imperativa (no le dices al procesador qué hacer, solo dices qué quieres que salga si se cumplen ciertas condiciones). Para este caso de uso, puede tener un aspecto similar al siguiente:Esto funciona (con cualquier versión XSLT), porque la primera de arriba tiene una mayor prioridad (tiene un predicado). La plantilla de coincidencia "fall-through", la segunda, captura cualquier cosa que no sea válida. El tercero se encarga de generar el
categoryName
valor de manera adecuada.Tenga en cuenta que en este escenario no hay necesidad para que coincida con specifially
categories
ocategory
, debido a que el procesador procesará automáticamente todos los niños, a menos que decimos que de otra forma (en este ejemplo, la segunda y la tercera plantilla No más trámite a los niños, porque no hayxsl: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 puede expandirse para otros elementos o excepciones simplemente agregando otra plantilla coincidente. Programación sin if-sucursales .
Nota: no existe tal cosa como
null
en XML. Hay xsi: nil , pero rara vez se usa, especialmente en escenarios sin tipo sin un esquema de algún tipo.fuente
Esta es probablemente la expresión XPath más simple (la respuesta aceptada proporciona una prueba para lo contrario, y sería más larga, si se niega):
Explicacion :
El argumento de la
not()
función anterior esfalse()
exactamente cuando no hay un elementocategoryName
secundario ("nulo") del elemento de contexto, o el elementocategoryName
secundario (único) tiene un valor de cadena: la cadena vacía.En XSLT 2.0 use :
Aquí hay un ejemplo completo :
Cuando esta transformación se aplica en el siguiente documento XML:
se produce el resultado deseado y correcto :
Cuando se aplica en este documento XML :
o sobre esto:
o en esto
Se produce el resultado correcto :
Del mismo modo, use esta transformación XSLT 1.0 :
Nota : no se utilizan condicionales en absoluto. Aprenda más sobre la importancia de evitar construcciones condicionales en este agradable curso de Pluralsight:
" Patrones de diseño táctico en .NET: flujo de control "
fuente
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:
fuente
categoryName
le da la expresión XPath cuando no haycategoryName
elementos secundarios en el contexto actual) se define como la cadena vacía, por lo que esto es redundante;string-length(categoryName)
es cero si no haycategoryName
elementos.Si un nodo no tiene ningún valor disponible en la entrada xml como debajo de xpath,
La función string () se convierte en valor vacío. Entonces esto funciona bien:
fuente
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.
fuente
De hecho, lo encontré mejor solo probando la longitud de la cadena ya que muchas veces el campo no es nulo, solo está vacío
fuente
Según mi experiencia, la mejor manera es:
fuente
Use simple categoryName / text () Tal prueba funciona bien en
<categoryName/>
y también<categoryName></categoryName>
.fuente