如何比较字符串与Xpath 1.0?

Mae*_*o13 6 php xslt xpath xslt-1.0

我正在使用<Xpath 1.0中的字符串来解决运算符问题.

这个简单的Xpath表达式

'A' < 'B' (or the equivalent 'A' &lt; '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函数.

Jim*_*son 7

在XPath 1.0中,字符串比较仅针对=和定义!=,并且排序比较不可用.规范说

当要比较的对象都不是节点集并且运算符是<=,<,> =或>时,则通过将两个对象转换为数字并根据IEEE 754比较数字来比较对象.

因此,两个操作数都被转换为float,使它们都是NaN.

我相信Microsoft的XML增加了扩展功能来处理这个问题,但当然这只有在你使用MSXML时才有用.


Mic*_*Kay 5

是的,这是 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 了。是什么阻碍了你?