6

XPATH1とXPATH2に関して次の質問があります。

<document>
    <val>3</val>
    <val>11</val>
    <val>3</val>
    <val>2</val>
    <val>12</val>
    <val>5</val>
    <val>0</val>
    <val>7</val>
</document>

xpath1:最大

//val[not(. < //val)]

分:

//val[not(. > //val)]

xpath2:

document/val[. = max(//val)]

document/val[. = min(//val)]

xpath1-maxクエリを使用したXPATH2処理で同じ結果が得られないのはなぜですか。

//val[not(. < //val)]

LASTノード(val 7)を取得しているようですが、最高値ではありません... MIN値の逆は、XPATH2処理で正常に機能します。

//val[not(. > //val)]

誰かが私を助けてくれますか?

4

1 に答える 1

6

とても良い点です。

xpath 1(およびxslt 1.0)では、//val[not(. < //val)]本質的にテキスト値を数値にキャストし、数値の比較を行っています。

したがって、正しい最小値と最大値を取得します。

ただし、xpath 2(およびxslt 2.0)では、テキストは数値にキャストされず、代わりに文字列の比較が行われます。したがって、文字列比較を使用すると、「7」は「12」よりも大きいため、7が最大値になります(リストの最後の値だけが返されるわけではありません。値の順序を入れ替えてみてください)。

したがって、xslt 1と2の両方で安全を確保するために行うべきことは、number()関数を使用してテキストのキャストを実行し、数値比較が確実に行われるようにすることです。

マックス:

//val[not(number(.) &lt; //val)]

最小:

//val[not(number(.) &gt; //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(.) &lt; //val)]" />
            </Max1>
            <Min1>
                <xsl:value-of select="//val[not(number(.) &gt; //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>

予想通り。

于 2012-11-02T12:18:50.833 に答える