2012-06-04 4 views
1

I два XPaths, f(x) и g(y), а также некоторые XML x.Состав XPath в XQuery

x = <example> 
    <a> 
    <number>1</number> 
    </a> 
    <b> 
    <letter>A</letter> 
    </b> 
    <c> 
    <number>2</number> 
    </c> 
</example> 

f(x) = /example/*

g(y) = /number|/letter

Как написать h(x) в XQuery таким образом, что для любого h(x) = g(f(x))g(x)? Я не знаю g(x) раньше времени, поэтому я не могу его изменить. При необходимости я могу изменить f(x). Все это должно произойти в XQuery, потому что это часть запроса Oracle.

h(x) = g(f(x)) = $data/example/*...?

+0

«Все это должно произойти в XQuery» не совсем точно. XQuery создается через некоторый код сцепления строки, поэтому я могу выполнять любые строковые манипуляции, которые я хочу создать. Я имею в виду, что я не могу сделать что-то вроде захвата набора совпадающих узлов, а затем применить «f (x)» к каждому узлу в этом наборе (если только я не могу сделать это в Oracle SQL, но производительность, вероятно, не идеальна). – mdonoughe

ответ

1

Может быть, я путать о вопросе, но если я правильно понял, то ответ

let $f := FFFF return $f/(GGGG) 

, где FFFF и GGGG являются выражения, соответствующие F (х) и г (у)

Но я предполагаю, что вы получили ваш пример неправильно, и когда вы писали

g(y) = /number|/letter 

вы имели в виду

g(y) = number|letter 

т. Е. Относительный выбор, а не абсолютный выбор.

+0

Да и нет относительно относительного выбора. Результат должен относиться к результату f, но большинство XPaths для g были написаны так, как если бы результат f был корневым элементом. Пусть вещь может работать. – mdonoughe

+0

Это '$ f/...' похоже на то, что началось с этого. Кажется, что все проблемы, с которыми я столкнулся, - это ошибки в XQuery Oracle, ошибки в Microsoft XPath или плохо написанный код, который стал неотъемлемой частью приложения и не может быть легко изменен. К сожалению, это, вероятно, будет устранено путем нечеткого разбиения строк и конкатенации из-за ограничений, налагаемых устаревшим кодом. Я приму этот ответ, потому что он работает, если я запустил его в mxquery. – mdonoughe

0

Одним из способов было бы конкатенации строк:

h(x, g_postfix) = '$data/example/*' + g_postfix 

Очевидно заботиться о '|' которые потребуют разделения, объединения и последующего соединения.

Другим способом было бы передать имя функции «g», а затем создать динамический SQL для выполнения его в цикле над списком узлов, который будет returend с помощью f().

+1

Разделительные и конкатенирующие работы для 'a | b', но' 'c/(a ​​| b)" 'становится' $ data/c/(a ​​| $ data/b) 'когда' $ data/c/(a ​​| б) «было бы правильно. – mdonoughe

+0

Управление строкой определенно менее надежным способом. Вместо этого передайте имя функции в виде строки и выполните динамический цикл SQL. –

Смежные вопросы