科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件XPath查询XML文档的注意事项

XPath查询XML文档的注意事项

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

正在建造的 XML 分类的主要目的是建立一个结构来集中存储我所拥有的书的信息,它应该足够灵活,可以进行查询和各种演示......

作者:佚名 来源:Microsoft 2007年11月5日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
提高我们的数学技能

  涉及关系或算术运算符和字符串的查询通常导致与直觉不相符的结果。XPath 将涉及关系或算术运算符的表达式中的所有操作数转换为数字。不完全是数字值的字符串将转换为 NaN(不是一个数)。下表显示某些 XPath 表达式、表达式隐式转换成的内容以及表达式的结果。

表达式 隐式转换 结果
'5' + 7 5 + 7 12
'5' + '7' 5 + 7 12
5 + 'a' 5 + NaN NaN
'5' < 7 5 < 7 True
'5' < '7' 5 < 7 True
'5' < 'b' 5 < NaN False
'a' < 'b' NaN < NaN False
'a' > 'b' NaN > NaN False


  必须注意到比较运算符(<、>、<=、>=)不执行字符串值的字典式比较功能。

  另一个有趣的算术定义是虽然定义了一元减号(例如 -6 是有效的 XPath 表达式),但是却未定义一元加号(+6 不是有效的 XPath 表达式)。更令人吃惊的是多重否定可以堆叠在一起,却仍然有效。因此,------6 是有效的 XPath 表达式,等效于值 6。

  XPath 缺乏对科学/指数记数法的支持将使用户犯错,因为支持它的既有流行的查询语言(如 SQL),也有流行的编程语言(如 C++)。

  在节点集合上结合算术和关系运算的表达式还可能导致令人吃惊的结果。节点集合上的算术运算将“集合中第一个节点”的值转换为数字,而关系运算符将判断“节点集合中的任意节点”是否满足条件。下面是一个 XML 文档,用来显示算术运算和关系运算符如何导致不 Associative(结合)的表达式。

   Numbers.xml

<Root>
<Numbers>
<Integer value="4" />
<Integer value="2" />
<Integer value="3" />
</Numbers>
<Numbers>
<Integer value="2" />
<Integer value="3" />
<Integer value="6" />
</Numbers>
</Root>

  下表显示缺乏结合性的算术运算。

表达式 结果 解释
Root/Numbers[Integer/@value > 4 - 1] <Numbers>

<Integer value="4" />

<Integer value="2" />

<Integer value="3" />

</Numbers>

<Numbers>

<Integer value="2" />

<Integer value="3" />

<Integer value="6" />

</Numbers>

选择文档中的所有 <Numbers> 元素,其中“至少一个”<Integer> 元素具有值大于 4 减 1 的 value 属性。
Root/Numbers[ 1 + Integer/@value > 4] <Numbers>

<Integer value="4" />

<Integer value="2" />

<Integer value="3" />

</Numbers>

选择文档中的所有 <Numbers> 元素,其中 1 加上具有值大于 4 的 value 属性的“第一个”<Integer> 元素。


  如果 XPath 是代数结合的,则两种查询将返回同样的结果。

  何时集合不是一个集合?

  虽然节点集合是无序的集合,就象数学(或您喜欢的编程语言)中的集合一样,但是处理它们通常与处理数学意义上的集合不同。XPath 中的某些操作在处理节点集合时使用“第一”语义,而其他操作使用“任意”语义。“第一”语义意味着该操作的节点集合的值从集合中的第一个节点获得,而“任意”语义则意味着节点集合中的操作取决于集合中的任何节点是否满足该条件。标题为“提高数学技能”的小节将介绍使用“任意”和“第一”语义的情况。

  XPath 节点集合与数学集合不同的另一个特征是 XPath 不直接提供机制以执行集合操作(如子集、交集或对称差集)。Michael Kay(XSLT Programmer's Reference 2nd edition 的作者)最早发现如何使用 count() 函数和联合运算符 | 来模拟缺少的集合运算符。下面列出了对上面一节中的 XML 文档执行集合操作的 XSLT 样式表及其输出。

  样式表

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" >

<xsl:output method="text" />

<xsl:variable name="a" select="/Root/Numbers[1]/Integer/@value"/>
<xsl:variable name="b" select="/Root/Numbers[1]/Integer/@value[. > 2]"/>
<xsl:variable name="c" select="/Root/Numbers[1]/Integer/@value[. = 3]"/>

<xsl:template match="/">

SET A: { <xsl:for-each select="$a"> <xsl:value-of select="." />, </xsl:for-each> }
SET B: { <xsl:for-each select="$b"> <xsl:value-of select="." />, </xsl:for-each> }
SET C: { <xsl:for-each select="$c"> <xsl:value-of select="." />, </xsl:for-each> }

a UNION b: { <xsl:for-each select="$a | $b"> <xsl:value-of select="."
/>, </xsl:for-each> }
b UNION c: { <xsl:for-each select="$b | $c"> <xsl:value-of select="."
/>, </xsl:for-each> }
a INTERSECTION b: { <xsl:for-each select="$a[count(.|$b) = count($b)]">
<xsl:value-of select="." />, </xsl:for-each> }
a INTERSECTION c: { <xsl:for-each select="$a[count(.|$c) = count($c)]">
<xsl:value-of select="." />, </xsl:for-each> }
a DIFFERENCE b: { <xsl:for-each select="$a[count(.|$b) != count($b)] |
$b[count(.|$a) != count($a)]"> <xsl:value-of select="." />, </xsl:for-each> }
a DIFFERENCE c: { <xsl:for-each select="$a[count(.|$c) != count($c)] |
$c[count(.|$a) != count($a)]"> <xsl:value-of select="." />, </xsl:for-each> }
a SUBSET OF b: { <xsl:value-of select="count($b | $a) = count($b)"/> }
b SUBSET OF a: { <xsl:value-of select="count($b | $a) = count($a)"/> }

</xsl:template>

</xsl:stylesheet>

  输出

SET A: { 4, 2, 3, }
SET B: { 4, 3, }
SET C: { 3, }

a UNION b: { 4, 2, 3, }
b UNION c: { 4, 3, }
a INTERSECTION b: { 4, 3, }
a INTERSECTION c: { 3, }
a DIFFERENCE b: { 2, }
a DIFFERENCE c: { 4, 2, }
a SUBSET OF b: { false }
b SUBSET OF a: { true }    


  节点集合和数学集合之间差异的最后一点是节点集合通常是有序的。W3C XPath 建议将它们描绘为无序的,但是 XSLT 确实指定了节点集合的顺序。
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章