La solution de regroupement suivante n'utilise pas de boucle et prend en charge tout autre élément de même type après le ItemGroup
. De plus, seule une petite clé basée sur MainItem
est utilisée pour identifier les groupes.
XSLT 1.0 sous saxon 6.5.5
texte production:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="main" match="MainItem/ItemGroup" use="text()"/>
<xsl:template match="/Data">
<xsl:apply-templates select="MainItem"/>
</xsl:template>
<xsl:template match="MainItem">
<xsl:value-of select="ItemGroup"/><xsl:text>
</xsl:text>
<xsl:apply-templates select="ItemGroup[generate-id(.)=generate-id(key('main', current()/ItemGroup)[1])]"/>
</xsl:template>
<xsl:template match="ItemGroup">
<xsl:apply-templates select="/Data/*[ItemGroup = current()]/*/following-sibling::*"/>
<xsl:text>
</xsl:text>
</xsl:template>
<xsl:template match="*">
<xsl:text>- </xsl:text><xsl:value-of select="."/><xsl:text>
</xsl:text>
</xsl:template>
</xsl:stylesheet>
Appliqué sur votre entrée, produit:
Foo
- Details
- Blah
Bar
- Details
- BlahBlah
Baz
- Details
- BlahBlahBlahBlahBlah
La production de sortie XML:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="main" match="MainItem/ItemGroup" use="text()"/>
<xsl:template match="/Data">
<xsl:copy>
<xsl:apply-templates select="MainItem"/>
</xsl:copy>
</xsl:template>
<xsl:template match="MainItem">
<xsl:variable name="id" select="ItemGroup"/>
<Group id="{$id}">
<xsl:apply-templates select="ItemGroup[generate-id(.)=generate-id(key('main', current()/ItemGroup)[1])]"/>
</Group>
</xsl:template>
<xsl:template match="ItemGroup">
<xsl:copy-of select="/Data/*[ItemGroup = current()]/*/following-sibling::*"/>
</xsl:template>
</xsl:stylesheet>
produit:
<Data>
<Group id="Foo">
<ItemDetails>Details</ItemDetails>
<OtherDataDetails>Blah</OtherDataDetails>
</Group>
<Group id="Bar">
<ItemDetails>Details</ItemDetails>
<OtherDataDetails>BlahBlah</OtherDataDetails>
</Group>
<Group id="Baz">
<ItemDetails>Details</ItemDetails>
<OtherDataDetails>BlahBlahBlahBlahBlah</OtherDataDetails>
</Group>
</Data>
Pouvez-vous montrer un peu de votre transformation? –
Bonne question, +1. Voir ma réponse pour une solution complète qui est la solution la plus courte et la plus efficace jusqu'à présent, n'utilise pas de conditions ou '' et contient une explication détaillée des points principaux et des liens vers le matériel de référence approprié ou enseigner ces concepts fondamentaux de XSLT. –