2017-05-05 6 views
0

XMLデータベースをBaseXに1 GBほどロードして、チュートリアルを読んだ後に立ち往生しました。ここではサンプル文書です:ノード属性を選択するとXQueryは結果を返しません

<GRUPO-DE-PESQUISA xmlns="http://www.cnpq.br/lmpl/2002/XSD/Grupo" NRO-ID-GRUPO="0002998250206250" ESTRATIFICACAO="" FORMATO-HORA-ATUALIZACAO="HHMMSS" HORA-ATUALIZACAO="092500" FORMATO-DATA-ATUALIZACAO="DDMMAAAA" DATA-ATUALIZACAO="08122016" SISTEMA-ORIGEM-XML="Lattes Extrator"> 
    <IDENTIFICACAO-DO-GRUPO NRO-ID-CNPQ-INSTITUICAO="4043451737504096" CODIGO-AREA-PREDOMINANTE="80200001" NOME-DA-UNIDADE="" NOME-DO-ORGAO="Colégio Pedro II" FLAG-INSTITUICAO-DE-ENSINO="" FLAG-AGENCIA-FOMENTO="N" SIGLA-DO-PAIS-DA-INSTITUICAO="BRA" NOME-DO-PAIS-DA-INSTITUICAO="BRA" UF-DA-INSTITUICAO="RJ" SIGLA-DA-INSTITUICAO="CP II" NOME-DA-INSTITUICAO="Colégio Pedro II" AREA-PREDOMINANTE="Letras" GRANDE-AREA-PREDOMINANTE="Lingüística, Letras e Artes" ANO-DE-CRIACAO="2015" NOME-DO-GRUPO=" LITESCOLA - Literatura e outras linguagens na Escola Básica: letramento literário e formação continuada do professor"> 
    <LIDERES> 
     <PRIMEIRO-LIDER NRO-ID-CNPQ="3361551338665953" PAIS-DE-NASCIMENTO="BRA" NACIONALIDADE="B" NOME-COMPLETO="Ana Cristina Coutinho Viegas"/> 
     <SEGUNDO-LIDER NRO-ID-CNPQ="6282140310430273" PAIS-DE-NASCIMENTO="BRA" NACIONALIDADE="B" NOME-COMPLETO="Márcio Vinícius do Rosário Hilário"/> 
    </LIDERES> 
</IDENTIFICACAO-DO-GRUPO> 
</GRUPO-DE-PESQUISA> 

@NOME-DO-GRUPOliteraturaが含まれている時はいつでも、私は@NRO-ID-GRUPOの値を取得したいのですが:

data(//IDENTIFICACAO-DO-GRUPO[matches(@NOME-DO-GRUPO,'^literatura','i')]/@NRO-ID-GRUPO) 

該当する結果は、上記のクエリに対して返されませんでした。私は何が欠けていますか?前もって感謝します。

+0

キャップの問題がありますか? 「Literatura」対「literatura」? – SmartDev

+0

大文字のLに置き換えられましたが、動作しませんでした... – wlwy

答えて

1

まず、選択しようとしている要素の名前はxmlns="http://www.cnpq.br/lmpl/2002/XSD/Grupo"です。あなたは、その名前空間を宣言し、それをあなたのXQueryモジュールのプロローグでプレフィックスを割り当てる必要があります:

declare namespace grupo = "http://www.cnpq.br/lmpl/2002/XSD/Grupo" 

そして、あなたの表現では、接頭辞を使用して要素を参照してください。

//grupo:IDENTIFICACAO-DO-GRUPO 

次に、あなたはWOに一致させたい場合は

matches(@NOME-DO-GRUPO,'^literatura','i') 

:あなたの正規表現でカラットの使用は、文字列の先頭に表示された場合にのみ一致するテキストliteraturaを強制的に

matches(@NOME-DO-GRUPO,'(^|\s)literatura($|\s)','i') 

また、あなたのアプリケーションに重要ですどのくらいの速さに応じて、それは相対的なパフォーマンスをテストする価値があるかもしれません:あなたは(^|\s)を使用することができますが、あなたはまた、末尾の境界を追加することができます一致するサブストリングを防止するために、RDの境界正規表現照合とトークン化のBaseXで上記の式を次のように比較してください:

tokenize(lower-case(@NOME-DO-GRUPO), '\s') = 'literatura' 
+0

データとして再書込みしようとしました// IDENTIFICACAO-DO-GRUPO [(NOME-DO-GRUPO、 '(^ | \ s)literatura($ | \ s ) '、' i ')]/@NRO-ID-GRUPO) '、まだヒットはありません。大文字のLを使って試しましたが、ヒットはまだありません。 – wlwy

+0

適切な名前空間を使用するか、ワイルドカード接頭辞を使用して要素を選択する必要があります。私の更新された答えを見てください。 – wst

+0

こんにちは。そこで式を次のように変更しました。 'declare namespace grupo =" http://www.cnpq.br/lmpl/2002/XSD/Grupo "; // grupo:IDENTIFICACAO-DO-GRUPO [@ NOME-DO-GRUPO、 'Literatura'] // @ NOME-DO-GRUPO、// @NRO-ID-GRUPO' 既存のすべてのIDを返します数字だけでなく、 "Literatura"を含むもの – wlwy

関連する問題