XSLT 2.0: добавление времени и совпадение - PullRequest
0 голосов
/ 06 октября 2018

Прежде всего, я использую XSLT 2.0 с SAXON-HE 9.5.1.5.

  1. Есть ли альтернатива следующей команде?

    <xsl:mode on-no-match="shallow-copy"/>
    
  2. В моем входном XML есть поле времени в формате ЧЧ: ММ.Я хочу добавить это, и результирующий формат также будет в формате ЧЧ: ММ.

Ввод XML

    <Root>
     <Detail>
      <Time>24:00</Time>
     <Detail>
     <Detail>
      <Time>59:10</Time>
     <Detail>
     <Detail>
      <Time>4:59</Time>
     <Detail>
     <Detail>
      <Time></Time>
     <Detail>
     <Detail>
     <Detail>
    <Root>

Буду признателен за быструю помощь.

Ответы [ 2 ]

0 голосов
/ 06 октября 2018

Чтобы добавить значения времени, я бы предложил

<xsl:variable name="totalTime"
   select="sum(Detail/Time ! 
                xs:dayTimeDuration(replace(., '(\d+):(\d+)', 'PT$1H$2M')))"/>

<xsl:value-of select="hours-from-duration($totalTime), 
                      format-number(minutes-from-duration($totalTime), '00')"
              separator=":"/>

Альтернативный способ преобразования времени в длительность состоит в добавлении ": 00", преобразовании в xs:time и вычитании xs:time('00:00:00').

Что касается xsl:mode, если вы обновитесь до последней версии (9.8 или 9.9), в Saxon-HE будет доступно объявление XSLT 3.0 xsl:mode.

0 голосов
/ 06 октября 2018

<xsl:mode on-no-match="shallow-copy"/> определено в https://www.w3.org/TR/xslt-30/#built-in-templates-shallow-copy,, в основном, для одного безымянного режима вы можете заменить его в XSLT 2 или 1, где вы не выполняете потоковую передачу с преобразованием идентичности (см. Также https://www.w3.org/TR/xslt20/#shallow-copy) template:

<xsl:template match="@* | node()">
  <xsl:copy>
    <xsl:apply-templates select="@* | node()"/>
  </xsl:copy>
</xsl:template>

Что касается форматирования продолжительности, вычисленной из суммы ваших значений времени, преобразованных в xs:dayTimeDuration с в XSLT 2, я думаю, что

  <xsl:function name="mf:format-duration" as="xs:string">
      <xsl:param name="duration" as="xs:dayTimeDuration"/>
      <xsl:sequence select="concat(format-number(xs:integer(floor($duration div xs:dayTimeDuration('PT1H'))), '00'), ':', format-number(minutes-from-duration($duration), '00'))"/>
  </xsl:function>

делает это.

Онлайн-образец на http://xsltransform.hikmatu.com/nc4NzPS.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...