xquery-как выбрать значение из определенного элемента, даже если этот элемент имеет нулевые значения/несколько значений, разделенных возвратом

Пожалуйста, рассмотрите следующий XML--

<table class="rel_patent"><tbody>
<tr><td>Name</td><td>Description</td></tr>
<tr><td>A</td><td>Type-A</td></tr>
<tr><td>B</td><td>Type-B</td></tr>
<tr><td>C</td><td>Type-C</td></tr>
<tr><td>AC</td><td>Type-C
Type-A</td></tr>
<tr><td>D</td><td></td></tr>
</tbody></table>

Теперь я хочу выбрать и отобразить все значения «Имя» с соответствующими. значения элемента «Описание» ... даже когда элемент «Описание» имеет нулевые значения, а именно элемент с именем = D, а также, когда элемент описания имеет значения, разделенные вводом, я хочу, чтобы эти значения (описания) были в отдельных строках, а именно Type- C и Type-A для элемента с именем=AC

Это тип запроса, который я написал:

let $rows_data:= $doc//table[@class="rel_patent"]/tbody/tr[1]/following-sibling::tr
for $data_single_row in $rows_data
return 
    let $cited_name:= $data_single_row/td[1]
    let $original_types_w_return:= $data_single_row/td[4]
    let $original_types_list:=    tokenize($original_types_w_return, '(\r?\n|\r)$')
    for $cited_type_each at $pos2 in $original_types_list
    return concat( $cited_name, '^', $original_type_each, '^', $pos2)

Однако я получаю ответ следующего типа:

A^Type-A^1
B^Type-B^1
C^Type-C^1
AC^Type-C
Type-A^1

Теперь мне нужно исправить следующее в приведенном выше коде + ответ ---

(1) Данные для «AC» должны быть 2 отдельными строками, где «Type-C» и «Type-A» должны находиться в каждой из 2 строк вместе с соответствующими. значение для последнего поля в каждой строке как 1 и 2 (потому что это 2 значения)

(2) Данные для "D" вообще не отображаются.

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


person Arvind    schedule 15.10.2012    source источник


Ответы (1)


Это работает:

for $data_single_row in $rows_data
return 
    let $cited_name:= $data_single_row/td[1]
    let $original_types_w_return:= $data_single_row/td[2]
    let $original_types_list:=    tokenize(concat($original_types_w_return, " "), '(\r?\n|\r)')
    for $cited_type_each at $pos2 in $original_types_list
    return concat( $cited_name, '^', normalize-space($cited_type_each), '^', $pos2)

(Первое изменение заключалось в замене $original_type_each на $cited_type_each и [4] на [2], что может быть ).

Первую проблему можно решить, удалив $ в конце параметра tokenize, так как в режиме по умолчанию $ соответствует только концу строки.

Второй решается добавлением пробела $original_types_w_return, поэтому он не пуст, и tokenize что-то возвращает, а затем снова удаляется с помощью normalize-space (в XQuery 3.0 это, вероятно, можно было бы решить, используя «разрешить пустое» в выражении for )

person BeniBela    schedule 15.10.2012