确定最小值和最大值时,xpath 1和xpath 2返回不同的结果

我有以下有关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)]

有人可以帮助我吗?

最佳答案
很好的一点.

在xpath 1(和xslt 1.0)中,// val [not(.< // val)]固有地将文本值转换为数字,并对数字进行比较. 因此,您可以获得正确的最小值和最大值. 但是,在xpath 2(和xslt 2.0)中,文本不会转换为数字,而是进行字符串比较.因此,使用字符串比较,’7’是> ’12’因此7仍将是最高值(它不会返回列表中的最后一个值 – 尝试交换值的顺序)

因此,在xslt 1和2中你应该做的就是使用number() function对文本进行强制转换,以确保完成数值比较.

马克斯:

//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>

正如所料.

转载注明原文:确定最小值和最大值时,xpath 1和xpath 2返回不同的结果 - 代码日志