Una domanda interessante e ben fatta! Secondo me, usare every
e satisfies
per superare le proprietà esistenziali dei confronti di sequenza è un metodo abbastanza valido e abbastanza canonico.
Ma dal momento che stai chiedendo un altro approccio: come ordinare le sequenze prima di confrontarle con deep-equal()
? Ipotizziamo due sequenze nel seguente foglio di stile:
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="text"/>
<xsl:variable name="A" select="('a','b','c')"/>
<xsl:variable name="B" select="('a','c','b')"/>
<xsl:template match="/">
<xsl:choose>
<xsl:when test="deep-equal($A,$B)">
<xsl:text>DEEP-EQUAL!</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>NOT DEEP-EQUAL</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:transform>
E, naturalmente, questa trasformazione ritorna
NOT DEEP-EQUAL
Ma se si ordina le sequenze prima di loro a confronto, per esempio, con una funzione personalizzata che fa uso di xsl:perform-sort
, vedere la relevant part of the specification:
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"
xmlns:local="www.local.com" extension-element-prefixes="local"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output method="text"/>
<xsl:variable name="A" select="('a','b','c')"/>
<xsl:variable name="B" select="('a','c','b')"/>
<xsl:template match="/">
<xsl:choose>
<xsl:when test="deep-equal(local:sort($A),local:sort($B))">
<xsl:text>DEEP-EQUAL!</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>NOT DEEP-EQUAL</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:function name="local:sort" as="xs:anyAtomicType*">
<xsl:param name="in" as="xs:anyAtomicType*"/>
<xsl:perform-sort select="$in">
<xsl:sort select="."/>
</xsl:perform-sort>
</xsl:function>
</xsl:transform>
quindi, il risultato sarà
DEEP-EQUAL!
EDIT: Infatti, set uguaglianza comporterebbe che non solo ordine è irrilevante, ma anche duplicati non dovrebbe fare una differenza. Pertanto, una corretta uguaglianza insieme significherebbe applicare anche distinct-values()
alle variabili della sequenza:
<xsl:when test="deep-equal(local:sort(distinct-values($A)),local:sort(distinct-values($B)))">