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>

ここで、「名前」のすべての値をcorrespで選択して表示したいと思います。「Description」要素の値...Description要素の値がnullの場合、つまりname = Dの要素である場合、およびdescription要素の値がEnterで区切られている場合でも、(Descriptionの)値を別々の行に配置する必要があります-viz Type- name=ACの要素のCおよびType-A

これは私が書いたタイプのクエリです-

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」のデータは、「Type-C」と「Type-A」が対応する2つの行のそれぞれにある2つの別々の行である必要があります。各行の最後のフィールドの値は1と2です(これらは2つの値であるため)

(2)「D」のデータは全く表示されていません。

これらの2つの要件に準拠するように上記のコードを修正するにはどうすればよいですか?

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]に置き換えることでした)。

最初の問題は、tokenizeパラメーターの最後にある$を削除することで解決できます。これは、デフォルトのモードでは、$は文字列の最後にしか一致しないためです。

2つ目は、スペース$ original_types_w_returnを追加することで解決されるため、空ではなく、tokenizeは何かを返し、normalize-spaceを使用して再度削除します(XQuery 3.0では、for式で「allowingempty」を使用することで解決できる可能性があります) )。

于 2012-10-15T15:16:41.327 に答える