Pregunta

He tenido dificultades para encontrar buenas formas de tomar un formato de hora y determinar fácilmente si es válido y luego producir un elemento resultante que tenga algún formato con XSLT 1.0.

Dado el siguiente xml:

<root>
    <srcTime>2300</srcTime>
</root>

Sería genial producir el xml resultante:

<root>
    <dstTime>23:00</dstTime>
</root>

Sin embargo, si el código fuente xml contiene un formato inválido de 24 horas, el elemento dstTime resultante debería estar en blanco.

Por ejemplo, cuando el xml fuente inválido es el siguiente:

<root>
    <srcTime>NOON</srcTime>
</root>

El xml resultante debería ser:

<root>
    <dstTime></dstTime>
</root>

La pregunta es, ¿cuál es el mejor fragmento XSLT 1.0 que podría escribirse para producir los resultados deseados? La esperanza sería mantenerlo bastante simple y no tener que analizar cada parte del tiempo (es decir, la coincidencia de patrones sería dulce si es posible).

¿Fue útil?

Solución

No hay expresiones regulares en XSLT 1.0, así que me temo que no será posible la coincidencia de patrones.

¿No tengo claro si se supone que <srcTime>23:00</srcTime> es legal o no? Si es así, intente:

<dstTime>
  <xsl:if test="string-length(srcTime) = 4 or
                string-length(srcTime) = 5">
    <xsl:variable name="hour" select="substring(srcTime, 1, 2)" />
    <xsl:if test="$hour >= 0 and 24 > $hour">
      <xsl:variable name="minute">
        <xsl:choose>
          <xsl:when test="string-length(srcTime) = 5 and
                          substring(srcTime, 3, 1) = ':'">
            <xsl:value-of select="substring(srcTime, 4, 2)" />
          </xsl:when>
          <xsl:when test="string-length(srcTime) = 4">
            <xsl:value-of select="substring(srcTime, 3, 2)" />
          </xsl:when>
        </xsl:choose>
      </xsl:variable>
      <xsl:if test="$minute >= 0 and 60 > $minute">
        <xsl:value-of select="concat($hour, ':', $minute)" />
      </xsl:if>
    </xsl:if>
  </xsl:if>
</dstTime>

Si no lo es, y cuatro dígitos es lo único que es legal, entonces:

<dstTime>
  <xsl:if test="string-length(srcTime) = 4">
    <xsl:variable name="hour" select="substring(srcTime, 1, 2)" />
    <xsl:if test="$hour >= 0 and 24 > $hour">
      <xsl:variable name="minute" select="substring(srcTime, 3, 2)" />
      <xsl:if test="$minute >= 0 and 60 > $minute">
        <xsl:value-of select="concat($hour, ':', $minute)" />
      </xsl:if>
    </xsl:if>
  </xsl:if>
</dstTime>

Otros consejos

XSLT 1.0 no tiene ningún soporte estándar para la manipulación de fecha / hora.

Debe escribir una función de análisis y formateo simple. Eso no va a ser simple, y eso no va a ser bonito.

XSLT está realmente diseñado para transformaciones de árbol. Este tipo de manipulación de nodos de texto se realiza mejor fuera de XSLT.

Dependiendo del procesador xslt real utilizado, podría realizar las operaciones deseadas en la función de extensión personalizada (que tendría que hacer usted mismo).

Xalan tiene un buen soporte para funciones de extensión , puede escribirlas no solo en Java, pero también en JavaScript u otros idiomas compatibles con Apache BSF .

El motor XSLT de Microsoft también admite extensiones personalizadas, como se describe en .NET Framework Guía del desarrollador, ampliación de las hojas de estilo XSLT

Echa un vistazo a: http://www.exslt.org/ específicamente las " fechas y horas " sección. No he profundizado en ello, pero parece que puede ser lo que estás buscando.

Incluso la función time () exslt.org no lo ayudará aquí, porque espera que su entrada esté en el formato adecuado (xs: dateTime o xs: time).

Esto es algo que se soluciona mejor fuera de XSLT. Digo esto como alguien que habitualmente usa XSLT para hacer cosas para las que realmente no fue diseñado y logra hacer que las cosas funcionen. Fue realmente no diseñado para analizar cadenas.

La solución ideal es arreglar lo que sea que esté produciendo el documento XML para que se formatee veces usando el estándar internacional establecido convenientemente para ese propósito, usando el principio de que no debe persistir o transmitir datos basura si puede evitar hacerlo .

Pero si eso no es posible, debe corregir los datos antes de pasarlos a XSLT o corregirlos después de generar la salida de la transformación.

Y para tener la lista completa, también hay Módulo de procesamiento de fecha / hora parte de XSLT Standard Library de Steve Ball.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top