Я пытаюсь сделать что-то сложное в xslt У меня есть xml-файл, который содержит большой список братьев и сестер и в зависимости от имени, которое я хочу преобразовать их детям Общие правила для моего преобразования:XSLT трансформирует родственных отношений детям
- Если метка/имя «БЛОК», а затем открыть элемент «Block» с тегом/значение в качестве атрибута
- Если метка/имя «BLOCK_END» закрыть элемент «Block» (
- В все остальные случаи создают тег/имя элемента, помещают тег/значение и немедленно закрывают его
Так для следующего XML:
<message>
<tag>
<name>BLOCK</name>
<value>first</value>
</tag>
<tag>
<name>FOO</name>
<value>BAR</value>
</tag>
<tag>
<name>BLOCK</name>
<value>second</value>
</tag>
<tag>
<name>FOO2</name>
<value>BAR2</value>
</tag>
<tag>
<name>BLOCK_END</name>
</tag>
<tag>
<name>BLOCK_END</name>
</tag>
<tag>
<name>BLOCK</name>
<value>third</value>
</tag>
<tag>
<name>FOO3</name>
<value>BAR3</value>
</tag>
<tag>
<name>BLOCK_END</name>
</tag>
</message>
это результат Я надеюсь на:
<message>
<BLOCK id="first">
<FOO>BAR</FOO>
<BLOCK id="second">
<FOO2>BAR2</FOO2>
</BLOCK>
</BLOCK>
<BLOCK id="third">
<FOO3>BAR3</FOO3>
</BLOCK">
</message>
Я использовал следующий XSLT. Это работает хорошо, но к сожалению, он заканчивает выполнение после encoutering первого BLOCK_END тега
<xsl:template match="/">
<message>
<xsl:apply-templates select="message/tag[1]" />
</message>
</xsl:template>
<xsl:template match="tag">
<xsl:variable name="tagName" select="name"/>
<xsl:variable name="tagValue" select="value"/>
<xsl:choose>
<xsl:when test="$tagName = 'BLOCK'">
<xsl:element name="{$tagName}">
<xsl:attribute name="id">
<xsl:value-of select="$tagValue"/>
</xsl:attribute>
<xsl:apply-templates select="./following-sibling::*[1]" />
</xsl:element>
</xsl:when>
<xsl:when test="$tagName = 'BLOCK_END'">
<!-- DO NOTHING-->
</xsl:when>
<xsl:otherwise>
<xsl:element name="{$tagName}">
<xsl:value-of select="$tagValue"/>
</xsl:element>
<xsl:apply-templates select="./following-sibling::*[1]" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
UPDATE: Благодаря BitTickler Я получаю ближе, но до сих пор не совсем там ,
Вы можете использовать в XSLT 2.0 процессора как Saxon 9, Altova, XmlPrime? –
@MartinHonnen К сожалению нет, я застрял в ядре XSLT 1.0 – DannyBoy
Вместо «НИЧЕГО» в BLOCK_END я бы попробовал что-то вроде ''' ', как вы хотите вернуться из текущей рекурсии, а затем продолжить с остальными тегами. –
BitTickler