2013-12-23 4 views
4

У меня есть XML-файл с именем Employees Name и Job, выполненным ими. Структура файла XML является -Как изменить структуру XML с помощью XQuery

<Employee>[email protected]#B#C#D</Employee> 
<Employee>[email protected]#B#C#D</Employee> 
<Employee>[email protected]#B#C#D</Employee> 
<Employee>[email protected]#B#C#D</Employee> 

Есть тысячи записей, и я должен изменить структуру -

<Employee> 
    <Name>AAA</Name> 
    <Jobs> 
    <Job>A</Job> 
    <Job>B</Job> 
    <Job>C</Job> 
    <Job>D</Job> 
    </Jobs> 
</Employee> 

Как получить это делается с помощью XQuery в Basex?

ответ

4

3 XQuery функции, substring-before, substring-after и tokenize используются для получения требуемого выходного сигнала.

substring-before Используется для получения имени.

Аналогичным образом, substring-after используется для получения задания.

Затем функция tokenize используется для разделения Рабочих мест.

let $data := 
    <E> 
    <Employee>[email protected]#B#C#D</Employee> 
    <Employee>[email protected]#B#C#D</Employee> 
    <Employee>[email protected]#B#C#D</Employee> 
    <Employee>[email protected]#B#C#D</Employee> 
    </E> 


for $x in $data/Employee 
return 

<Employee> 
    {<Name>{substring-before($x,"@")}</Name>} 
    {<Jobs>{ 
    for $tag in tokenize(substring-after($x,"@"),'#') 
    return 
    <Job>{$tag}</Job> 
    }</Jobs> 
}</Employee> 

НТН ...

+0

Спасибо большое :) –

2

Tokenizing строку, вероятно, проще и быстрее. tokenize($string, $pattern) разделяет $string, используя регулярное выражение $pattern, head($seq), возвращает первое значение последовательности и tail($seq) все, кроме первого. Конечно, вы также можете использовать позиционные предикаты, но эти функции легче читать.

for $employee in //Employee 
let $tokens := tokenize($employee, '[@#]') 
return element Employee { 
    element Name { head($tokens) }, 
    element Jobs { 
    for $job in tail($tokens) 
    return element Job { $job } 
    } 
}