一个有趣且提出得很好的问题!在我看来,使用
every
和
satisfies
来克服序列比较的存在属性是一种非常有效和规范的方法。
但是,既然您问到另一种方法:如何在使用
deep-equal()
比较之前对序列进行排序呢?让我们假设以下样式表中有两个序列:
<?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>
当然,这个转换会返回以下内容。
NOT DEEP-EQUAL
但是,如果在比较这些序列之前对它们进行排序,例如使用一个自定义函数来使用xsl:perform-sort
进行排序,请参阅规范的相关部分:
<?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>
然后,结果将是:
DEEP-EQUAL!
编辑: 实际上,集合相等意味着不仅顺序无关紧要,而且重复项也不会有影响。 因此,正确的集合相等意味着还需对序列变量应用distinct-values()
:
<xsl:when test="deep-equal(local:sort(distinct-values($A)),local:sort(distinct-values($B)))">