Вы можете использовать следующий скрипт:
<?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, '
')"/>
</xsl:template>
</xsl:stylesheet>
Соответствующий шаблон Stage[@Type = 'Movement']
отфильтровывает строки с Type = "Movement".
Следующий шаблон, соответствующий @Type[matches(., 'Stage')]
, выполняетперевод Stage
в N
.
И, наконец, последний шаблон, соответствующий Stage
, выполняет основную работу.Это:
- Печатает (возможно измененное) значение атрибута
Type
. - Вычисляет переменную (
nxtStart
), содержащую атрибут Start
в следующем родственнике, но исключая тес Type = 'Movement'
, но если он отсутствует, то суррогатное значение равно 50000
. - Печатает остаток того, что должно быть напечатано.