Изменение одинаковых значений в разных узлах - PullRequest
0 голосов
/ 27 ноября 2018

Мне нужно локализовать значения внутри одинаковых братьев и сестер.Если они одинаковы, мне нужно их изменить.

Я думаю, что мне нужно каким-то образом использовать «следующий брат», «предыдущий брат» и «группировать».Первая группа - по значению, которое я ищу, чтобы получить те, которые одинаковы в позиции друг за другом.Затем с помощью родственных функций выясните, равны ли они.

Пример:

<programs>
    <event>
        <start>2018-11-25T13:55:00</start>
    </event>
    <event>
        <start>2018-11-27T17:00:00</start>
    </event>
    <event>
        <start>2018-11-25T13:55:00</start>
    </event>
    <event>
        <start>2018-11-25T13:55:00</start>
    </event>
</programs>

Код:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">
    <xsl:template match="/">
        <output>
            <xsl:for-each select="/programs/event">
                <xsl:variable name="starttime" select="./start"/>
                <startOfProgram><xsl:value-of select="$starttime"/></startOfProgram>
            </xsl:for-each> 
        </output>
    </xsl:template>
</xsl:stylesheet>

Желаемые результаты:

<output>
    <startOfProgram>2018-11-25T13:55:00</startOfProgram>
    <startOfProgram>2018-11-25T13:56:00</startOfProgram>
    <startOfProgram>2018-11-25T13:57:00</startOfProgram>
    <startOfProgram>2018-11-27T17:00:00</startOfProgram>
</output>

Я знаю, что это длинный выстрел, так что если кто-нибудьмог бы указать мне правильное направление или помочь мне с одной частью проблемы, я был бы очень благодарен.

В образце, который я вынул, есть много других элементов, которые также переносятся на выход.Если это имеет значение, я могу включить их в список.

Пс.Обратите внимание, что это значение может легко составить 2018-11-25T18:30:00, которое затем должно быть 2018-11-25T18:30:00 и последовательным 2018-11-25T18:31:00, если их больше.

1 Ответ

0 голосов
/ 27 ноября 2018

Показанный вами результат выглядит так, как будто вы хотите сгруппировать значения как xs:dateTime значения, а затем просто добавить одну минуту к каждому элементу в группе в зависимости от позиции:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="#all"
    expand-text="yes"
    version="3.0">

  <xsl:mode on-no-match="shallow-copy"/>

  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="programs">
      <output>
          <xsl:for-each-group select="event/start/xs:dateTime(.)" group-by=".">
              <xsl:for-each select="current-group()">
                  <startOfProgram>{. + (position() - 1) * xs:dayTimeDuration('PT1M')}</startOfProgram>
              </xsl:for-each>
          </xsl:for-each-group>
      </output>
  </xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty -development.net / pPqsHUv / 1 и выше - XSLT 3, но для процессора XSLT 2 я думаю, что вам нужно только изменить шаблон текстового значения, которое я использовал, на xsl:value-of:

<startOfProgram><xsl:value-of select=". + (position() - 1) * xs:dayTimeDuration('PT1M')"/></startOfProgram>

См. http://xsltransform.hikmatu.com/6qVRKvJ

...