Сравнивая 2 последовательности в xslt
У меня есть 2 последовательности, одна от 1 до 10, а другая от 1 до 3. Как сравнить вторую последовательность с первой последовательностью, чтобы проверить, совпадают ли первые 3 элемента?
2 ответа
Используйте это короткое выражение XPath:
deep-equal(subsequence($seq1, 1, count($seq2)), $seq2)
При оценке это дает true()
точно, если вторая последовательность является начальной подпоследовательностью первой. Эти две последовательности могут содержать смесь любых элементов XDM, включая узлы.
Вот полная демонстрация:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:variable name="vSeq1" select=
"1, 2, 3, 4, 5, 6, 7, 8, 9, 10"/>
<xsl:variable name="vSeq2" select=
"1, 2, 3"/>
<xsl:variable name="vSeq3" select="/*/*"/>
<xsl:variable name="vSeq4" select="/*/*[position() gt 5]"/>
<xsl:variable name="vSeq5" select="/*/*"/>
<xsl:variable name="vSeq6" select="/*/*[position() le 5]"/>
<xsl:template match="/">
<xsl:sequence select=
"deep-equal(subsequence($vSeq1, 1, count($vSeq2)), $vSeq2)"/>
===========
<xsl:sequence select=
"deep-equal(subsequence($vSeq3, 1, count($vSeq4)), $vSeq4)"/>
===========
<xsl:sequence select=
"deep-equal(subsequence($vSeq5, 1, count($vSeq6)), $vSeq6)"/>
</xsl:template>
</xsl:stylesheet>
Когда это преобразование применяется к следующему документу XML:
<nums>
<num>01</num>
<num>02</num>
<num>03</num>
<num>04</num>
<num>05</num>
<num>06</num>
<num>07</num>
<num>08</num>
<num>09</num>
<num>10</num>
</nums>
желаемый, правильный результат получается:
true
===========
false
===========
true
Предполагая, что у вас есть две переменные seq1
а также seq2
Вы можете просто проверить <xsl:if test="$seq1[1] eq $seq2[1] and $seq1[2] eq $seq2[2] and $seq1[3] eq $seq2[3]">...</xsl:if>
,