es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo hacer un bucle for en XSLT 1.0 para imprimir un calendario de 52 semanas independientemente de los datos.

Entiendo algunas de las limitaciones de XSLT1.0 con el bucle for-each. Necesito una forma de procesar un archivo 52 veces para poder asignar una salida a cada una de las 52 semanas del año. El archivo es un simple XML de Tiempo Fuera del Trabajo (cada nodo tiene fecha / hora / código, etc.) y necesito que cada semana contenga los registros de cualquier tiempo fuera del trabajo reservado para esa semana, pero siempre debo generar 52 secciones incluso si no hay datos en la semana.
Los datos estarán ordenados por fecha, pero necesito una forma de repetirlos 52 veces. Siempre deben ser 52 semanas a partir de la semana pasada, por lo que siempre debe ser relativo, de lo contrario habría creado un XML temporal dentro de XSLT.

For-each solo funciona si hay más de 52 nodos, por lo que no puedo usar eso ya que puede que no haya más de 52 nodos.

Datos Originales

    <Record>
    <emp_number>73001486</emp_number>
    <paycode>HOLIDAY</paycode>
    <allday_flag>True</allday_flag>
    <halfday_flag>False</halfday_flag>
    <nethours>96.000</nethours>
    <startdate_time>2021-12-14 00:00:00</startdate_time>
    <enddate_time>2021-12-16 00:00:00</enddate_time>
    </Record>

Salida:

2021-12-06
2021-12-13
73001486,HOLIDAY,96

¡Cualquier idea será agradecida!

Actualización: El comienzo de la semana es la semana pasada, lo cual puedo derivar de la información proporcionada. Siempre son semanas completas. No me importan las vacaciones que abarcan varias semanas, solo me importan las fechas de inicio de tiempo fuera del trabajo dentro de los periodos de 52 semanas (lo cual entiendo cómo deducir).

Tags:  

Answer

  1. Avatar for davy.ai

    Para procesar un archivo 52 veces y asignar una salida a cada una de las 52 semanas del año utilizando XSLT 1.0, puedes usar una combinación de expresiones XPath y funciones XSLT. Aquí tienes un enfoque que puedes seguir:

    1. Primero, determina la fecha de inicio de la semana actual. Mencionaste que el inicio de la semana siempre es la semana anterior, por lo que puedes usar la siguiente expresión XPath para obtener la fecha de inicio de la semana actual:
      <xsl:value-of select="xs:date(current-dateTime() - xs:dayTimeDuration('P7D'))"></xsl:value-of>
      

      Esto calcula la fecha y hora actuales (current-dateTime()), resta una duración de 7 días (xs:dayTimeDuration('P7D')) para obtener el inicio de la semana anterior, y luego convierte el resultado en una fecha (xs:date()).

    2. A continuación, puedes usar un bucle for para iterar a través de las 52 semanas. Dado que siempre deseas generar 52 secciones incluso si no hay datos, puedes usar la función position() para determinar el número de la semana actual y generar una sección para cada una. Aquí tienes un ejemplo:

      <xsl:for-each select="1 to 52">
       <xsl:variable name="weekStart" select="xs:date(current-dateTime() - xs:dayTimeDuration(concat('P',(52 - position())*7,'D')))"></xsl:variable>
       <xsl:variable name="weekEnd" select="$weekStart + xs:dayTimeDuration('P6D')"></xsl:variable>
       <xsl:element name="Week">
         <xsl:attribute name="startDate">
           <xsl:value-of select="$weekStart"></xsl:value-of>
         </xsl:attribute>
         <xsl:apply-templates select="Record[startdate_time &gt;= $weekStart and startdate_time &lt;= $weekEnd]"></xsl:apply-templates>
       </xsl:element>
      </xsl:for-each>
      

      En este bucle for, utilizamos select="1 to 52" para iterar a través de las 52 semanas. Calculamos la fecha de inicio para la semana actual ($weekStart) utilizando la misma expresión XPath que en el paso 1, pero ahora restamos una duración de (52 - position())*7 días para obtener la fecha de inicio de la semana actual en relación con el final del año. También calculamos la fecha de finalización para la semana actual ($weekEnd) sumándole una duración de 6 días a la fecha de inicio.

      Dentro del bucle, generamos un elemento Week con un atributo para la fecha de inicio (startDate). Utilizamos la función apply-templates para procesar únicamente los elementos Record que caen dentro de la semana actual. Puedes definir una plantilla para procesar estos elementos Record y generar el formato deseado.

      Si no hay elementos Record para una semana dada, el elemento Week aún se generará con un contenido vacío.

      Ten en cuenta que los elementos Record deben estar ordenados por fecha para que este enfoque funcione correctamente. Puedes utilizar el elemento xsl:sort para lograr esto.

      Con este enfoque, puedes procesar el archivo 52 veces y generar una sección para cada semana, independientemente de si hay datos para esa semana o no. La salida siempre estará en relación con la semana actual, como especificaste.

Comments are closed.