2012-06-22 2 views
0

с использованием Xquery, как я могу вставлять переменную в выражение xquery в следующий XML-документ. У меня есть следующий XML-документИспользование переменной в выражениях XQuery

<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> 

мне нужно выдать запрос, возвращающий все диски с год> 1986. Я хочу, хотел бы иметь компоненты «где» п как переменные, я имею в виду, хранящих YEAR > 1986 в для трех переменных и использовать переменные в запросе, здесь то, что я до сих пор

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()); 

Мое выражение запроса не является совершенным, я думаю, что у меня возникают проблемы при использовании переменных, любой может помочь мне в решая это, пожалуйста?

ответ

2

Переменные в XQuery (и XSLT/XPath) представляют значения, а не фрагменты текста программы. То есть, это не макроязык - переменные не работают с помощью текстовой подстановки.

Использование переменной для значения является простым: x = $ value.

Использование переменной для имени элемента не так уж сложно: * [имя() = $ п] = $ значение

Но при использовании переменной для оператора не представляется возможным. Когда вы дойдете до этого уровня, лучше сгенерировать запрос в виде строки с использованием конкатенации строк, а затем скомпилировать ее и выполнить. На самом деле, похоже, вы все равно генерируете запрос как строку (не беспокоясь о риске инъекции кода, я вижу).

+0

Спасибо за ваш ответ. Да, это правильная переменная, которую нельзя использовать для оператора. но могу ли я сохранить переменные $ и $ value в запросе и явно указать оператор? Я имею в виду изменение запроса, чтобы выглядеть следующим образом: «где $ cat/$ field» + «>» + «$ value»? Это возможно? – Lucy

+0

@Lourin - Я думаю, вам нужно использовать функцию расширения, такую ​​как 'saxon: evaluation()' для этого. Какой процессор вы используете? –

+0

Я использую xqj, я только начал работать над XQuery, могу ли я использовать saxon: evaluation() в xqj? Спасибо – Lucy