Fl0*_*D3R 6 xpath max min xpath-2.0
我有以下有关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>
Run Code Online (Sandbox Code Playgroud)
xpath1:最大
//val[not(. < //val)]
Run Code Online (Sandbox Code Playgroud)
分钟:
//val[not(. > //val)]
Run Code Online (Sandbox Code Playgroud)
xpath2:
document/val[. = max(//val)]
document/val[. = min(//val)]
Run Code Online (Sandbox Code Playgroud)
为什么我在使用xpath1-max查询的XPATH2处理中得不到相同的结果:
//val[not(. < //val)]
Run Code Online (Sandbox Code Playgroud)
似乎我得到了LAST节点(带有val 7),但没有得到最高值......对于MIN值来说,另一种方法适用于XPATH2处理:
//val[not(. > //val)]
Run Code Online (Sandbox Code Playgroud)
有人可以帮助我吗?
很好的一点.
在xpath 1(和xslt 1.0)中,//val[not(. < //val)]本质上是将文本值转换为数字,并对数字进行比较.
因此,您可以获得正确的最小值和最大值.
但是,在xpath 2(和xslt 2.0)中,文本不会转换为数字,而是进行字符串比较.因此,使用字符串比较,'7'是>'12',因此7仍然是最高值(它不返回列表中的最后一个值 - 尝试交换值的顺序)
因此,在xslt 1和2中你应该做的是使用number()函数对文本进行强制转换,以确保完成数值比较.
马克斯:
//val[not(number(.) < //val)]
Run Code Online (Sandbox Code Playgroud)
闵:
//val[not(number(.) > //val)]
Run Code Online (Sandbox Code Playgroud)
将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>
Run Code Online (Sandbox Code Playgroud)
返回
<x>
<Max1>12</Max1>
<Min1>0</Min1>
<Max2>12</Max2>
<Min2>0</Min2>
</x>
Run Code Online (Sandbox Code Playgroud)
正如所料.
| 归档时间: |
|
| 查看次数: |
973 次 |
| 最近记录: |