Yo uso xlstproc para transformar un archivo xml a otro formato de archivo xml, durante la transformación, necesito calcular la diferencia de tiempo de valor (duración en segundos o minutos:segundos) entre el inicio y el final de los campos.

...
<start>2011-12-13 16:15:26</start>
<end>2011-12-13 16:17:27</end>
...

He encontrado una Plantilla de Sintaxis, pero no pudo hacer uso de ella.

<xsl:call-template name="date:duration">
  <xsl:with-param name="seconds" select="number" />?
</xsl:call-template>

Agradecería alguien me puede dar una pista de cómo lograr mi objetivo. Gracias de antemano!

  • No estoy seguro de lo que quieres decir por «una Sintaxis de la Plantilla». Quieres decir que has encontrado una plantilla que se supone que para calcular la diferencia de tiempo entre dos cadenas de hora? En cualquier caso, si mostrar o enlace a la implementación de la plantilla, y describir la manera de no trabajar, probablemente podemos ayudarle.
InformationsquelleAutor Karlbo Zino | 2012-01-04

1 Comentario

  1. 6

    Hice algo de su trabajo para usted y encontrar esta fecha:duración de la función, que parecen estar tratando de utilizar. Sin embargo, la fecha:duración convierte un número de segundos en una duración de formato de cadena, mientras que usted quiere encontrar la diferencia (duración) entre dos datetime cadenas.

    Usted probablemente querrá fecha:diferencia lugar.
    Si usted lee el la documentación para esta función/plantilla, usted encontrará esto acerca de los argumentos:

    Las dos fechas deben estar a la derecha truncada a la fecha/hora en una de las cadenas de
    los formatos definidos en [XML Schema Part 2: tipos de datos]. … Los formatos permitidos son como sigue…

    xs:dateTime (CCYY-MM-DDThh:mm:ss)
    ...

    Hay cursiva está en el original: CCYY-MM-DDThh:mm:ss excepto la T no está en cursiva. En otras palabras, el tiempo de las cadenas de la necesidad de un literal T entre la fecha y la hora, mientras que el tuyo tiene un espacio.

    Entonces yo sugeriría que la fijación de:

    <start>2011-12-13T16:15:26</start>
      <end>2011-12-13T16:17:27</end>

    Pasar el start y end cadenas como parámetros de la plantilla. Usted puede hacer esto simplemente pasar el start y end nodos del elemento, que se convierte automáticamente en las cadenas basándose en su contenido de texto:

    <xsl:variable name="time-diff-dur">
      <xsl:call-template name="date:difference">
        <xsl:with-param name="start" select="start" />
        <xsl:with-param name="end" select="end" />
      </xsl:call-template>
    </xsl:variable>
    <!-- The above returns a duration formatted string, so convert that to seconds: -->
    <xsl:variable name="time-diff-sec">
      <xsl:call-template name="date:seconds">
        <xsl:with-param name="seconds" select="$time-diff-dur" />?
      </xsl:call-template>
    </xsl:variable>

    Este código asume que el nodo de contexto es el padre de la <start> y <end> elementos. Después de que el código anterior, la variable $time-diff-sec contendrá un árbol de resultados fragmento, que puede ser convertido a un número utilizando number($time-diff-sec) si es necesario.

    Nos permiten saber si que funciona. Si no, el estado específicamente lo que el resultado fue y cómo difiere de lo que esperaba.

    Actualización:

    Me di cuenta de que usted está usando xsltproc (que utiliza libxslt). De acuerdo a esta documentación, libxslt apoya date:difference (y date:seconds) de forma nativa. Así que usted puede llamar a estas funciones como funciones en lugar de definir una plantilla con nombre y llamarlo como una plantilla. Que sería mucho menos código para usted, aunque menos portable:

    <xsl:variable name="time-diff-sec"
        select="date:seconds(date:difference(start, end))" />

    Como antes, que tendrá que declarar el date prefijo de espacio de nombres en algún lugar, generalmente en su xsl:stylesheet elemento:

    <xsl:stylesheet version="1.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:date="http://exslt.org/dates-and-times"
        extension-element-prefixes="date">

    Actualización 2:

    Ver esta respuesta para un portátil XSLT 1.0 plantilla para convertir una cadena de fecha de número de segundos, lo que le permite restar una fecha a partir de la otra. (Gracias a Sam B para que el comentario).

    • Bonito investigación, LarsH.
    • Buena respuesta, +1.
    • Funciona con la sugerencia dentro de actualización de la sección, muchas gracias!
    • eres bienvenido. Me alegro ayudó. Por favor, marque la casilla de verificación para «aceptar» la respuesta si se resuelve el problema.
    • Otro Perfecto answser – stackoverflow.com/questions/38604414/…
    • Gracias, he añadido una actualización para ese efecto.

Dejar respuesta

Please enter your comment!
Please enter your name here