2009-08-21 11 views
7

Tengo una función XSLT que comprueba si el parámetro enviado está en formato AAAAMMDD o no. En algunas condiciones que no estoy recibiendo ningún valor a la función, durante estas condiciones SAXON es tirar abajo de errorManejo de secuencia vacía en la función XSLT

"una secuencia vacía no está permitido como primer argumento del CDA: isValidDate()"

¿Alguna sugerencia sobre cómo manejar esta situación?

Respuesta

12

En XSLT no hay valor nulo. Para representar un valor perdido, puede usar una cadena de longitud cero o una secuencia vacía. No son lo mismo: una secuencia vacía devolvería 0 desde el recuento ($ x) pero una cadena de longitud cero es una secuencia que contiene un elemento de tipo xs: cadena que tiene una longitud de cadena de 0 (recuento ($ x) = 1 y string-length ($ x) = 0).

La mayoría de las funciones estándar de XPath aceptan una cadena de longitud cero o una secuencia vacía, pero es posible que su función personalizada no lo haga.

El problema puede aparecer si está seleccionando la secuencia de caracteres. Por ejemplo, si selecciona el valor de un nodo que contiene la cadena, el nodo no existe, obtendrá una secuencia vacía, pero si el nodo existe y el valor está vacío, obtendrá la cadena vacía.

Modifique la forma en que selecciona el valor para tener siempre la cadena vacía (o ajuste/cambie la función isValidDate para aceptar la secuencia vacía). La siguiente definición de función aceptará la secuencia vacía y la convertirá en una cadena de longitud cero

<xsl:function name="cda:isValidDate" as="xs:boolean"> 
    <xsl:param name="datestring" as="xs:string?"/> 
    <xsl:variable name="reallyastring" select="string($datestring)"/> 
    Your code 
</xsl:function> 

¿El? en el xs: cadena? el tipo de param permite que se proporcionen uno o ningún elemento. La función de cadena (...) nunca devuelve una cadena vacía, por lo que convertirá la secuencia vacía en una cadena de longitud cero.

+1

O use 'xs: choose' para verificar si la secuencia está vacía (' count() = 0') antes de llamar a la función. –

+0

¿cómo puedo declarar mi función para aceptar la secuencia vacía? ¿hay algún tipo de datos para eso? –

+0

Han actualizado la respuesta para mostrar cómo aceptar la secuencia vacía y convertirla a la cadena de longitud cero. –

Cuestiones relacionadas