переменная в xpath - PullRequest
       42

переменная в xpath

3 голосов
/ 01 ноября 2011

Я пишу xquery на eXist .

Обычно я использую этот способ для выбора элемента в XML:

fn:doc($document_name)/root/a

Но теперь я хочу получить xpath из строковой переменной:

let $xpath := request:get-parameter("xpath", "")
fn:doc($document_name)/$xpath

Конечно, это не работает. Единственный способ, который я нашел сейчас, это использовать eval:

util:eval(fn:concat("fn:doc($document_name)", $xpath)):)

но я не хочу использовать eval, потому что это медленно и небезопасно.

Я знаю, что есть что-то вроде:

fn:doc($document_name)/*[name()='node_name']

но я хочу выбрать элемент по всему пути, а не только по имени узла и я также пытался использовать node-xpath(), но не знаю, как его использовать, как name()

Ответы [ 2 ]

5 голосов
/ 01 ноября 2011

Вы хотите сделать то, что делает функция eval (), поэтому любое решение будет иметь те же проблемы, что и eval.Другой подход, который вы могли бы рассмотреть, - это сгенерировать запрос и затем выполнить его, но у него будут точно такие же проблемы.Если вы считаете, что может быть безопаснее ограничить строку подмножеством выражений XPath (например, без предикатов или без вызовов функций), вы можете попробовать проверить эти условия с помощью простых регулярных выражений.

1 голос
/ 02 ноября 2011

, несмотря на то, что Майкл Кей прав, возможно, functx: dynamic-path () может помочь.

Это может быть хорошим промежуточным решением, находящимся между fn: eval и генерирующим запрос динамически.

Надеюсь, это поможет

Michael

...