xquery-即使该元素具有空值/多个返回分隔值,如何从特定元素中选择值

时间:2012-10-15 14:33:43

标签: xpath xquery flwor

请考虑以下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>

现在我想用corresp选择并显示“Name”的所有值。 “描述”元素的值...即使当Description元素具有空值时,viz元素具有name = D,并且当description元素具有由enter分隔的值时,我希望这些值(描述)在单独的行中 - 即类型 - 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”在两行中的每一行中都有对应。每行中最后一个字段的值为1和2(因为它们是2个值)

(2)“D”的数据根本没有显示。

如何更正上述代码以符合这两项要求?

1 个答案:

答案 0 :(得分: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替换为$ referenced_type_each,将[4]替换为[2],这可能是。

第一个问题可以通过删除tokenize参数末尾的$来解决,因为在默认模式下$ only只匹配字符串的结尾。

第二个是通过添加一个空格$ original_types_w_return来解决的,所以它不是空的,tokenize返回一些东西,然后用normalize-space再次删除它(在XQuery 3.0中它可能通过使用'允许空'来解决) for表达式)