Xpath 在XQuery表达式中使用变量

Xpath 在XQuery表达式中使用变量,xpath,xquery,xquery-sql,Xpath,Xquery,Xquery Sql,使用Xquery,如何在以下xml文档的Xquery表达式中嵌入变量。我有以下xml文档 <CD> <TITLE>Picture book</TITLE> <ARTIST>Simply Red</ARTIST> <COUNTRY>EU</COUNTRY> <COMPANY>Elektra</COMPANY> &

使用Xquery,如何在以下xml文档的Xquery表达式中嵌入变量。我有以下xml文档

<CD>
        <TITLE>Picture book</TITLE>
        <ARTIST>Simply Red</ARTIST>
        <COUNTRY>EU</COUNTRY>
        <COMPANY>Elektra</COMPANY>
        <PRICE>7.20</PRICE>
        <YEAR>1985</YEAR>
    </CD>
    <CD>
        <TITLE>Red</TITLE>
        <ARTIST>The Communards</ARTIST>
        <COUNTRY>UK</COUNTRY>
        <COMPANY>London</COMPANY>
        <PRICE>7.80</PRICE>
        <YEAR>1987</YEAR>
    </CD>
    <CD>
        <TITLE>Unchain my heart</TITLE>
        <ARTIST>Joe Cocker</ARTIST>
        <COUNTRY>USA</COUNTRY>
        <COMPANY>EMI</COMPANY>
        <PRICE>8.20</PRICE>
        <YEAR>1986</YEAR>
    </CD>
我的查询表达式不完美,我想我在使用变量时遇到了问题,有人能帮我解决这个问题吗? 谢谢

XQuery(和XSLT/XPath)中的变量表示值,而不是程序文本的片段。也就是说,它不是一种宏语言——变量不能通过文本替换来工作

使用变量作为值很简单:x=$value

使用变量作为元素名并不太难::[name()=$n]=$value


但是为操作符使用变量是不可能的。当您达到这个级别时,最好使用字符串连接将查询生成为字符串,然后编译并执行它。事实上,您似乎正在以字符串的形式生成查询(我明白了,不用担心代码注入的风险)。

谢谢您的回答,是的,这是正确的变量不能用于运算符。但是我可以在查询中保留$field和$value变量并显式指定运算符吗?我的意思是将查询更改为如下“where$cat/$field”+“>”+“$value”?这可能吗?@Lourin-我想你需要使用一个扩展函数,比如
saxon:evaluate()
。您使用的是什么处理器?我正在使用xqj,我刚刚开始使用XQuery,我可以在xqj中使用saxon:evaluate()吗?ThanksXQJ是一个可用于包括Saxon在内的许多XQuery处理器的接口。saxon:evaluate()是saxon特有的,但许多XQuery处理器都有类似的扩展函数。
String queryString =
                "declare variable $field :=" +"YEAR"+";"+
                "declare variable $operator :=" +">"+";"+
                "declare variable $value :=" +"1986"+";"+
                "declare variable $docName as xs:string external;" + sep +
                "for $cat in doc($docName)/*/"+ "CD" +
                 "where $cat/$field $operator $value" +
                "order by $cat/$field" +
                "return $cat";

              XQExpression expression = conn.createExpression();
              expression.bindString(new QName("docName"), filename,
              conn.createAtomicType(XQItemType.XQBASETYPE_STRING));
              results = expression.executeQuery(queryString);
              return results.getSequenceAsString(new Properties());