0

请考虑以下 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 的元素,而且,当描述元素具有由输入分隔的值时,我希望这些值(描述)在单独的行中 - 即类型 - C 和 Type-A 用于 name=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”的数据。

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

4

1 回答 1

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] which may )。

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

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

于 2012-10-15T15:16:41.327 回答