Преобразование данных XML с помощью XSLT - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть следующие данные XML

<UserStaging>
            <NeuroRKStaging>
               <Stage Type="REM" Start="0" />
               <Stage Type="Stage3" Start="150" />
               <Stage Type="Movement" Start="3030" />
               <Stage Type="Wake" Start="3150" />
               <Stage Type="Stage2" Start="4680" />
               <Stage Type="Stage3" Start="5340" />
               <Stage Type="Movement" Start="6090" />
               <Stage Type="Wake" Start="6480" />
               <Stage Type="Stage1" Start="9330" />
               <Stage Type="Stage3" Start="10290" />
            </NeuroRKStaging>
</UserStaging>

Я должен получить их в следующем формате:

REM 150
N2 3150
Wake 4680
N2 5340
N3 6480
Wake 9330
N1 10290
N3 50000

Существует пять «типов»:

Stage1 transforms to N1
Stage2 transforms to N2
Stage3 transforms to N3
REM remains REM
Wake remains Wake

Все строки с Type = "Movement" должны быть удалены и только после этого данные должны быть преобразованы.«Старт» каждой следующей стадии будет числом после «типа» перед ним.Для последнего «типа» (в этом примере N3) число должно быть 50000

Как будет выглядеть таблица стилей xsl для этого?Я могу использовать до XSLT версии 3. Спасибо за любую помощь!

1 Ответ

0 голосов
/ 26 февраля 2019

Вы можете использовать следующий скрипт:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
  <xsl:output method="text"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="Stage[@Type = 'Movement']"/>

  <xsl:template match="@Type[matches(., 'Stage')]">
    <xsl:value-of select="concat('N', substring(., 6))"/>
  </xsl:template>

  <xsl:template match="Stage">
    <xsl:apply-templates select="@Type"/>
    <xsl:variable name="nxtStart" select="
      (following-sibling::*[not(@Type = 'Movement')][1]/@Start, 50000)[1]"/>
    <xsl:value-of select="concat(' ', $nxtStart, '&#xA;')"/>
  </xsl:template>
</xsl:stylesheet>

Соответствующий шаблон Stage[@Type = 'Movement'] отфильтровывает строки с Type = "Movement".

Следующий шаблон, соответствующий @Type[matches(., 'Stage')], выполняетперевод Stage в N.

И, наконец, последний шаблон, соответствующий Stage, выполняет основную работу.Это:

  • Печатает (возможно измененное) значение атрибута Type.
  • Вычисляет переменную (nxtStart), содержащую атрибут Start в следующем родственнике, но исключая тес Type = 'Movement', но если он отсутствует, то суррогатное значение равно 50000.
  • Печатает остаток того, что должно быть напечатано.
...