В дополнение к существующему ключу, я думаю, вам нужен еще один ключ (который будет использоваться первым), чтобы сгруппировать детали по тому, имеют ли они ID = 01 или нет
<xsl:key name="ItemGroupOne" match="Details" use="ID = '01'"/>
Попробуйте этот XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="no" indent="yes"/>
<xsl:strip-space elements="*" />
<xsl:key name="ItemGroupOne" match="Details" use="ID = '01'"/>
<xsl:key name="ItemGroup" match="Details" use="ID"/>
<xsl:template match="/*">
<Items>
<xsl:apply-templates/>
</Items>
</xsl:template>
<xsl:template match="Details[generate-id()=generate-id(key('ItemGroupOne',ID = '01')[1])]">
<Split>
<xsl:apply-templates select="key('ItemGroupOne',ID = '01')" mode="items" />
</Split>
</xsl:template>
<xsl:template match="Details[generate-id()=generate-id(key('ItemGroup',ID)[1])]" mode="items">
<ItemID name="{ID}">
<xsl:copy-of select="key('ItemGroup',ID)"/>
</ItemID>
</xsl:template>
<xsl:template match="Details"/>
<xsl:template match="Details" mode="items"/>
</xsl:stylesheet>
Использование mode
здесь позволяет избежать конфликтов шаблонов.
Также обратите внимание, что для конечных шаблонов, которые игнорируют Details
, вам не нужна логика not
вусловие здесь, так как шаблоны, которые соответствуют элементу с условием, будут иметь более высокий приоритет, чем шаблоны, которые просто соответствуют элементу без условия.
Попробуйте здесь: http://xsltfiddle.liberty -development.net /gWvjQfr
Или, может быть, напишите это так, если вы хотите отказаться от использования «режима» и шаблонов, которые игнорируют элементы ...
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="no" indent="yes"/>
<xsl:strip-space elements="*" />
<xsl:key name="ItemGroupOne" match="Details" use="ID = '01'"/>
<xsl:key name="ItemGroup" match="Details" use="ID"/>
<xsl:template match="/*">
<Items>
<xsl:apply-templates select="Details[generate-id()=generate-id(key('ItemGroupOne',ID = '01')[1])]" />
</Items>
</xsl:template>
<xsl:template match="Details">
<Split>
<xsl:for-each select="key('ItemGroupOne',ID = '01')[generate-id()=generate-id(key('ItemGroup',ID)[1])]">
<ItemID name="{ID}">
<xsl:copy-of select="key('ItemGroup',ID)"/>
</ItemID>
</xsl:for-each>
</Split>
</xsl:template>
</xsl:stylesheet>