とても良い点です。
xpath 1(およびxslt 1.0)では、//val[not(. < //val)]
本質的にテキスト値を数値にキャストし、数値の比較を行っています。
したがって、正しい最小値と最大値を取得します。
ただし、xpath 2(およびxslt 2.0)では、テキストは数値にキャストされず、代わりに文字列の比較が行われます。したがって、文字列比較を使用すると、「7」は「12」よりも大きいため、7が最大値になります(リストの最後の値だけが返されるわけではありません。値の順序を入れ替えてみてください)。
したがって、xslt 1と2の両方で安全を確保するために行うべきことは、number()関数を使用してテキストのキャストを実行し、数値比較が確実に行われるようにすることです。
マックス:
//val[not(number(.) < //val)]
最小:
//val[not(number(.) > //val)]
スタイルシートでのSaxonの使用:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<x>
<Max1>
<xsl:value-of select="//val[not(number(.) < //val)]" />
</Max1>
<Min1>
<xsl:value-of select="//val[not(number(.) > //val)]" />
</Min1>
<Max2>
<xsl:value-of select="/document/val[. = max(//val/text())]" />
</Max2>
<Min2>
<xsl:value-of select="/document/val[. = min(//val/text())]" />
</Min2>
</x>
</xsl:template>
</xsl:stylesheet>
戻り値
<x>
<Max1>12</Max1>
<Min1>0</Min1>
<Max2>12</Max2>
<Min2>0</Min2>
</x>
予想通り。