Преобразование чч: мм: сс в мм: сс не работает для каждого элемента - PullRequest
0 голосов
/ 26 сентября 2018

Я пытаюсь преобразовать файл XML в формат, который может прочитать стороннее программное обеспечение.Моя проблема заключается в том, как время отформатировано в каждом из файлов XML.Выходные данные первого формата отформатированы как чч: мм: сс, однако целевое программное обеспечение запутывается и читает это как мм: сс.Таким образом, любое событие оказывается в 60 раз короче, чем оно есть на самом деле!Разработчики посоветовали мне преобразовать часы и минуты в минуты.

В самом начале шаблона при преобразовании сводных данных я использовал следующее:

<xsl:attribute name="duration">
   <xsl:value-of select="format-number(floor(dive/summary/calculated/@duration div 60), '00')"/>
   <xsl:value-of select="format-number(dive/summary/calculated/@duration mod 60, ':00')"/>
</xsl:attribute>

Который аккуратно преобразовал 1:02:50 в 62:50.Все идет нормально.Когда я использую одну и ту же конструкцию в элементе for-each, то все работает не так хорошо.Соответствующая часть моего шаблона выглядит следующим образом:

<xsl:for-each select="dive/data/row">
   <sample>

      <xsl:attribute name="duration">
         <xsl:value-of select="format-number(floor(@duration div 60), '00')"/>
         <xsl:value-of select="format-number(@duration mod 60, ':00')"/>
      </xsl:attribute>

      <xsl:attribute name="depth"><xsl:value-of select="format-number(@depth, '0.00')"/></xsl:attribute>
      <xsl:attribute name="temp"><xsl:value-of select="@temp"/></xsl:attribute>
      <xsl:attribute name="po2"><xsl:value-of select="format-number(@po2-av, '0.00')"/></xsl:attribute>
   </sample>
</xsl:for-each>

Ниже приведен пример соответствующей части моего вывода XML:

<sample duration="NaNNaN" depth="7.30" temp="18" po2="0.65"/>
<sample duration="NaNNaN" depth="7.50" temp="18" po2="0.56"/>
<sample duration="NaNNaN" depth="7.50" temp="18" po2="0.55"/>

Я также пытался использовать переменнуючтобы отформатировать метки времени, но в итоге получится ошибка компиляции в таблице стилей:

<xsl:variable name="dur" select="@duration" />
   <xsl:value-of select="format-number(floor($seconds div 60) mod 60, ':00')"/>
   <xsl:value-of select="format-number($seconds mod 60, ':00')"/>

<xsl:attribute name="time"><xsl:value-of select="@dur"/></xsl:attribute>

Во-первых, кто-нибудь может объяснить, почему числовой формат работает в первом случае, но не в элементе for-each.Во-вторых, я был бы признателен за мысли о том, как будет работать код XLST.

РЕДАКТИРОВАТЬ: образец входного XML-кода теперь включен:

<dive UID="VMS-RED-5051_#-127#4AB4B4675CCE7036_dive_842960947_3084" profile="1" interface-version="vms-2-5" code-version="3.1.9" record-interval="5" serial-number="4AB4B4675CCE7036" records="755" total-hours=" 47" summary-only="false">
   <summary time-start=" 842960947" max-depth=" 30.84" time-end=" 842964718" time-offset="-127" time-datum="1991-12-31 00:00:00">
      <tissues ... </tissues>
      <gasses> ... </gasses>
      <calculated duration="3771" start-date="2018-09-16 11:51:14" average-depth="13.277" average-tpm="12.877"/>
   </summary>
   <data>
      <row index="0" depth="1.1" po2-av="0.64" valve="71" temp="19" filter="68" gas-no="1" bat-2="3.96" bat-1="3.96" hp-dil="219" hp-02="175" po2-cell-1="0.64" po2-cell-2="0.65" po2-cell-3="0.65" setpoint="0.60" tissue-ceiling="0" hud="1" sensor_flags="97" co2="0.00" duration="00:00:00">
         <tpm .../>
      </row>
      <row index="1" depth="1.1" po2-av="0.64" valve="0" temp="19" filter="68" gas-no="1" bat-2="3.96" bat-1="3.96" hp-dil="218" hp-02="175" po2-cell-1="0.64" po2-cell-2="0.65" po2-cell-3="0.65" setpoint="0.60" tissue-ceiling="0" hud="1" sensor_flags="97" co2="0.00" duration="00:00:05">
         <tpm .../>
      </row>
      ...
      <row index="752" depth="1.7" po2-av="0.89" valve="6" temp="14" filter="37" gas-no="1" bat-2="3.95" bat-1="3.95" hp-dil="168" hp-02="117" po2-cell-1="0.89" po2-cell-2="0.88" po2-cell-3="0.90" setpoint="0.92" tissue-ceiling="0" hud="1" sensor_flags="97" co2="1.25" duration="01:02:40">
         <tpm .../>
        <alarms>
           <alarm> ... </alarms>
      </row>
      <row index="753" depth="0.9" po2-av="0.87" valve="4" temp="14" filter="37" gas-no="1" bat-2="3.95" bat-1="3.95" hp-dil="168" hp-02="117" po2-cell-1="0.87" po2-cell-2="0.86" po2-cell-3="0.88" setpoint="0.86" tissue-ceiling="0" hud="1" sensor_flags="97" co2="1.27" duration="01:02:45">
        <tpm .../>
        <alarms>
           <alarm> ... </alarms>
      </row>
      <row index="754" depth="0.2" po2-av="0.77" valve="0" temp="14" filter="37" gas-no="1" bat-2="3.95" bat-1="3.95" hp-dil="168" hp-02="116" po2-cell-1="0.77" po2-cell-2="0.77" po2-cell-3="0.78" setpoint="0.80" tissue-ceiling="0" hud="1" sensor_flags="97" co2="1.27" duration="01:02:50">
        <tpm .../>
        <alarms>
           <alarm> ... </alarms>
      </row>
    </data>
</dive>

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Вы выполняете арифметику для атрибута @duration:

floor(@duration div 60)

Атрибут @duration в вашем примере ввода не является числом:

duration="00:00:00"

Арифметика для значений, которые не являютсяне дает цифры NaN.

0 голосов
/ 26 сентября 2018

В вашем элементе calculated атрибут продолжительности имеет значение "3771", которое является числом (в секундах?)

Однако в элементе row атрибут продолжительности имеет значение "01:02:40 "(например), который не является числом, и поэтому вы не можете выполнять числовые вычисления над ним.

Однако вы можете использовать некоторые строковые функции для извлечения компонентов и выполнения числовых функций для этого.

Например,

<xsl:attribute name="duration">
  <xsl:value-of select="format-number(number(substring-before(@duration, ':')) * 60 + number(substring-before(substring-after(@duration, ':'), ':')), '00')"/>
  <xsl:value-of select="substring-after(substring-after(@duration, ':'), ':')" />
</xsl:attribute>

Однако, если вы можете использовать XSLT 2.0, вы можете использовать format-time, чтобы сделать его немного более читабельным

<xsl:attribute name="duration">
  <xsl:value-of select="format-number(xs:integer(format-time(@duration, '[H1]')) * 60 + xs:integer(format-time(@duration, '[m1]')), '00')" />
  <xsl:value-of select="format-time(@duration, '[s01]')" />
</xsl:attribute>

(Где xs: объявлено как пространство имен http://www.w3.org/2001/XMLSchema)

...