Я изо всех сил пытаюсь заставить работать 'для каждой группы', я недавно переключился на xslt 2, но у меня все еще есть некоторая работа, чтобы понять все это.Я пытаюсь очистить некоторые файлы, полученные от Framemaker MIF (flat xml), и хотя в большинстве случаев данные довольно чистые, это исключения, которые сводят меня с ума.Я объединил несколько типичных примеров в XML ниже.Пример, который я использую, относится к тегу подчеркивания, в принципе файлы создаются следующим образом: если вы видите тег [Underline /], все последующие элементы должны быть подчеркнуты, пока вы не достигнете тега [EndUnderline /], поэтому моя цель состоит в том, чтобыизбавиться от обоих этих тегов и инкапсулировать все промежуточные элементы в один тег [u].Проблема, однако, заключается в том, что могут быть последующие теги [Underline /], которые необходимо игнорировать до тех пор, пока не будет достигнут фактический тег [EndUnderline /].
Давайте попробуем сделать вышеуказанное более видимым, это упрощенный файл XML:
<TestFile>
<!-- Para tag containing no underline tags -->
<Para>
<Content>[text_not_underlined]</Content>
</Para>
<!-- correct encapsulation from source -->
<Para>
<Content>
<Underline/>[text_to_be_underlined]<EndUnderline/>
<p>Some test data</p>
</Content>
</Para>
<!-- extra underline tag that should be ignored -->
<Para>
<Content>
<Underline/>[text_to_be_underlined]
<Underline/>
<EndUnderline/>
<p>Some other test data</p>
</Content>
</Para>
<!-- some extra end underline tags that should be ignored -->
<Para>
<Content>
<EndUnderline/>[no_longer_underline]<EndUnderline/>
<p>: More data</p>
</Content>
</Para>
</TestFile>
Это то, что я получил до сих пор с моим xslt:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Content">
<xsl:copy>
<xsl:for-each-group select="node()" group-ending-with="EndUnderline">
<xsl:choose>
<xsl:when test="current-grouping-key()">
<xsl:variable name="start" select="current-group()[self::Underline][1]"/>
<xsl:copy-of select="current-group()[$start >> .]"/>
<u>
<xsl:copy-of select="current-group()[. >> $start][not(self::Underline)][not(self::EndUnderline)]"/>
</u>
</xsl:when>
<xsl:otherwise>
<xsl:copy-of select="current-group()"/>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each-group>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
И вот результат:
<TestFile>
<!-- Para tag containing no underline tags -->
<Para>
<Content>
<u/>
</Content>
</Para>
<!-- correct encapsulation from source -->
<Para>
<Content>
<u>[text_to_be_underlined]</u>
<u/>
</Content>
</Para>
<!-- extra underline tag that should be ignored -->
<Para>
<Content>
<u>[text_to_be_underlined]</u>
<u/>
</Content>
</Para>
<!-- some extra end underline tags that should be ignored -->
<Para>
<Content>
<u/>
<u/>
</Content>
</Para>
</TestFile>
Пока это то, что яЯ стремлюсь к:
<TestFile>
<!-- Para tag containing no underline tags -->
<Para>
<Content>[text_not_underlined]</Content>
</Para>
<!-- correct encapsulation from source -->
<Para>
<Content>
<u>[text_to_be_underlined]</u>
<p>Some test data</p>
</Content>
</Para>
<!-- extra underline tag that should be ignored -->
<Para>
<Content>
<u>[text_to_be_underlined]</u>
<p>Some other test data</p>
</Content>
</Para>
<!-- some extra end underline tags that should be ignored -->
<Para>
<Content>
[no_longer_underline]
<p>: More data</p>
</Content>
</Para>
</TestFile>
Заранее благодарим за любой совет, который может указать мне правильное направление!