Esta transformación:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="kFieldByName" match="Field"
use="concat(@name, '+', @displayName)"/>
<xsl:template match=
"Field[generate-id()
=
generate-id(key('kFieldByName',
concat(@name, '+', @displayName)
)[2])
]
">
<xsl:copy-of select=
"key('kFieldByName',concat(@name, '+', @displayName))"/>
</xsl:template>
</xsl:stylesheet>
cuando se aplica sobre el documento XML proporcionado:
<Root>
<Fields>
<Field name="abc" displayName="aaa" />
<Field name="pqr" displayName="ppp" />
<Field name="abc" displayName="aaa" />
<Field name="xyz" displayName="zzz" />
</Fields>
</Root>
produce el resultado deseado:
<Field name="abc" displayName="aaa"/>
<Field name="abc" displayName="aaa"/>
Explicación:
Muenchian grouping usando la clave compuesta (en los atributos name
y displayName
).
La única plantilla en el código coincide con cualquier elemento Field
que sea el segundo en su grupo correspondiente. Luego, dentro del cuerpo de la plantilla, se genera todo el grupo.
agrupación Muenchian es forma eficiente de agrupar en XSLT 1.0. Las claves se usan para la eficiencia.
Ver también mi respuesta a this question.
II. XSLT 2.0 solución:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/">
<xsl:for-each-group select="/*/*/Field"
group-by="concat(@name, '+', @displayName)">
<xsl:sequence select="current-group()[current-group()[2]]"/>
</xsl:for-each-group>
</xsl:template>
</xsl:stylesheet>
Cuando se aplica esta transformación en el documento XML proporcionado (se muestra más arriba), de nuevo el resultado deseado, correcta se produce:
<Field name="abc" displayName="aaa"/>
<Field name="abc" displayName="aaa"/>
Explicación:
Uso de <xsl:for-each-group>
Uso de la función current-group()
.
Buena pregunta, +1. Vea mi respuesta para una solución XSLT 1.0 corta, fácil y eficiente. –
También se agregó una solución XSLT 2.0. –
¿Te resultó útil esta respuesta? –