Во-первых, обратите внимание, что type
является атрибутом, поэтому вам нужно использовать префикс @
для обозначения этого
<xsl:apply-templates select="data[@type='basic']"/>
Затем, в вашем шаблоне, совпадающем с базовыми элементами, вам сначала потребуетсявыберите дочерние узлы ...
<xsl:apply-templates />
Затем вам нужно выбрать первый следующий элемент data
, но только если он является "дополнительным"
<xsl:apply-templates select="following-sibling::data[1][@type='extra']" />
.иметь шаблон, соответствующий «дополнительному» шаблону для вывода его узлов
<xsl:template match="data[@type='extra']">
<xsl:apply-templates />
</xsl:template>
Попробуйте этот XSLT
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="items">
<items>
<xsl:apply-templates select="data[@type='basic']"/>
</items>
</xsl:template>
<xsl:template match="data[@type='basic']">
<item>
<xsl:apply-templates />
<xsl:apply-templates select="following-sibling::data[1][@type='extra']" />
</item>
</xsl:template>
<xsl:template match="data[@type='extra']">
<xsl:apply-templates />
</xsl:template>
</xsl:stylesheet>
Обратите внимание на использование шаблона идентификации для копирования всех других узлов.(Замените это на <xsl:mode on-no-match="shallow-copy"/>
, если вы используете XSLT 3.0)
Также обратите внимание, что вы можете сделать <xsl:apply-templates select="following-sibling::data[1][@type='extra']/*" />
.Тогда вам не понадобится шаблон для «лишнего».
Смотрите его в действии на http://xsltfiddle.liberty -development.net / nc4NzR9