Mae*_*o13 6 php xslt xpath xslt-1.0
我正在使用<Xpath 1.0中的字符串来解决运算符问题.
这个简单的Xpath表达式
'A' < 'B' (or the equivalent 'A' < 'B')
Run Code Online (Sandbox Code Playgroud)
我在libxslt(这是一个XSLT 1.0引擎)的xslt运行中没有评估为true.
我检查了XML Spy,它允许在1.0和2.0中测试Xpath表达式,果然,在Xpath 2.0中它的计算结果为true,但在Xpath 1.0中它的计算结果为false!
这是Xpath 1.0中的错误吗?
我应该使用什么其他表达式来比较两个字符串/字符的字母顺序?请注意,compare()函数不会这样做,因为这是一个XSLT 2.0函数.
在XPath 1.0中,字符串比较仅针对=和定义!=,并且排序比较不可用.规范说
当要比较的对象都不是节点集并且运算符是<=,<,> =或>时,则通过将两个对象转换为数字并根据IEEE 754比较数字来比较对象.
因此,两个操作数都被转换为float,使它们都是NaN.
我相信Microsoft的XML增加了扩展功能来处理这个问题,但当然这只有在你使用MSXML时才有用.
是的,这是 XPath 1.0 的限制。(我认为将您不喜欢的限制称为“错误”是不合理的,尽管 XPath 2.0 的设计者显然同意您的意见,认为这是一个不受欢迎的限制)。
您已将问题标记为“xslt”,因此您可以在 XSLT 级别解决该问题,至少如果您的处理器具有节点集扩展名:
<xsl:variable name="nodes">
<node><xsl:value-of select="$A"/></node>
<node><xsl:value-of select="$B"/></node>
</xsl:variable>
<xsl:for-each select="exslt:node-set($nodes)/*">
<xsl:sort select="."/>
<xsl:if test="position()=1 and .=$A">A comes first!</xsl:if>
</xsl:for-each>
Run Code Online (Sandbox Code Playgroud)
但也许是时候转向 2.0 了。是什么阻碍了你?
| 归档时间: |
|
| 查看次数: |
12303 次 |
| 最近记录: |