xQuery如何在路径表达式

时间:2018-02-17 18:04:48

标签: xpath xquery xquery-3.0 xquery-3.1

我有一个XML文档:

<resultsets>
    <row>
        <emp_no>10001</emp_no>
        <first_name>Georgi</first_name>
        <last_name>Facello</last_name>
    </row>
    <row>
        <emp_no>10007</emp_no>
        <first_name>Bezalel</first_name>
        <last_name>Simmel</last_name>
    </row>
</resoutsets>

我有一个变量查询emp_no字段定义为:

let $emp_no := doc("employees.xml")//emp_no

我想在我的查询中使用$ emp_no节点名称(emp_no)来执行相同的操作,例如:

doc("employees.xml")//$emp_no/name()

是否可以在表达式左侧的路径中包含变量?

2 个答案:

答案 0 :(得分:1)

是的,您可以在XPath表达式中使用变量。但目前尚不清楚你在想或想要实现什么。

如果您要选择与分配给name()变量的元素具有相同$emp_no的元素,则可以匹配任何元素,然后使用predicate filter测试name()是否等于name()中元素序列中的任何$emp_no值:

doc("employees.xml")//*[name() = $emp_no/name()]

但是,这只会返回已分配给emp_no元素的相同$emp_no个元素。

答案 1 :(得分:0)

  

是否可以在表达式左侧的路径中包含变量?

这里的关键点是用一个变量引用替换路径中的名称在语法上是合法的,但它并不意味着你可能认为它意味着什么。如果变量$ X的值为&#34; orders&#34;,那么

//customer/$X

并不意味着

//customer/orders

相反,它意味着

//customer/"orders"

返回一次出现的字符串&#34; orders&#34;对于文档中的每个客户元素。

如果要查找名称等于字符串$ X的元素,请使用

//customer/*[name()=$X]

除非涉及名称空间,否则您需要比较名称空间URI和本地名称。