XQuery例子

下面是一些使用以下XML文档的示例XQueries:

           
           
           
           
            -122.857000,49.138000
           
           
7455 132 St, Surrey, BC, Canada
           
            
             -122.856695,49.137818,0
            
           

          

          

          

由于顶级节点包含名称空间声明'xmlns',因此必须在查询中声明名称空间,并且必须使用它来指定每个元素。查询:

声明名称空间x = ' http://earth.google.com/kml/2.0 ';

/ x: kml

结果:

' _result'有值'
           
            
             
              -122.857000,49.138000
             
             
              
7455 132 St, Surrey, BC, Canada
-122.856695,49.137818,0

如果顶级节点没有名称空间属性(即” ,那么下面的XPath表达式将产生相同的结果:

/ kml

下面的XPath表达式将返回完整的XML字符串,而不考虑名称空间:

/*

类似地,可以使用通配符'*'指定查询的深度:

/ * / * / * / * / *
' _result'有值'
           
            -122.856695,49.137818,0
           

以'//'开头的XPath表达式将指定搜索从与直接跟随的元素匹配的任何节点开始。

声明名称空间x = ' http://earth.google.com/kml/2.0 ';
/ / x:点
' _result'有值'
           
            
             -122.856695,49.137818,0
            
           

下面的查询将匹配所有节点:

/ / *

返回七个特性,结果包含kml、响应、名称、Placemark、地址、点和坐标节点的值。

要检索属性的值,请使用以下语法:

声明名称空间x = ' http://earth.google.com/kml/2.0 ';
字符串(/ / x: Placemark / @ id)
' _result'的值为' p1'

在上述所有示例中,查询都是一个简单的XPath表达式。XQuery还支持使用“for”、“let”、“where”、“order by”和“return”关键字进行更复杂的操作。也可以在查询中使用'doc("file.xml")'函数指定XML源文件。

声明名称空间x = ' http://earth.google.com/kml/2.0 ';
对于doc中的$node(“address.xml”)//x:Placemark

其中$node/@id = 'p1'

返回concat($节点/地址/ text (),

“位于”,

美元节点/点/协调/ text ())

' _result'有值' 7455 132 St, Surrey, BC, Canada is located -122.856695,49.137818,0'

下面是一些使用以下XML文档的示例XQuery更新:

           
           
           
           
           
            49.37238665158286 - -123.17986965179443
           
           
            49.37064012679701 - -123.17738056182861
           

          
           
            49.3715203830451 - -123.17888259887695
           

          
           
           
           
            爱丽丝怀特岛
           
加拿大BC省温哥华西36大街1037号
alice.wight@example.com

          

          

          

          

下面的查询将重新命名包围元素在文档中出现的任何地方:

将node //topLeft重命名为“左上角”,
将node //右下角重命名为“lowerRight”

结果如下:

           
            49.37238665158286 - -123.17986965179443
           
           
            49.37064012679701 - -123.17738056182861
           

替换为:

           
            49.37238665158286 - -123.17986965179443
           
           
            49.37064012679701 - -123.17738056182861
           

假设使用土布信封的格式更改为使用gml信封。下面是进行修改的XQuery:

声明名称空间gml = "http://www.opengis.net/gml";
对于//parcelBounds中的$node
回报(
删除节点的节点,美元
插入节点
           
           
            {$节点/ topLeft / text ()}
           
           
            {$节点/ bottomRight / text ()}
           
$node/..
)

结果如下:

           
           
            49.37238665158286 - -123.17986965179443
           
           
            49.37064012679701 - -123.17738056182861
           

          

替换为:

           
           
            49.37238665158286 - -123.17986965179443
           
           
            49.37064012679701 - -123.17738056182861
           

          

假设爱丽丝·怀特把她的包裹卖给了亨利·库珀。以下查询将更新“packages”文件中的相关信息。xml"(包含原始的xml样本):

对于doc中的$node ("parcels.xml")//owner,其中$node/name = "Alice Wight"
回报(
将node $node/name的值替换为"Henry Cooper",
替换节点$node/address的值[@type='mail']
“加拿大BC省温哥华西38大街2062号”
替换节点$node/address的值[@type='email']
与“henry.cooper@example.com”
)

在文件“包裹”中。xml", these two lines:

           
           
            爱丽丝怀特岛
           
加拿大BC省温哥华西36大街1037号
alice.wight@example.com

          

将更新为包含以下内容:

           
           
            亨利•库珀
           
加拿大BC省温哥华西38街2062号
henry.cooper@example.com