2017-05-05 90 views
0

將1 GB左右的XML數據庫加載到BaseX中,並在閱讀了一些教程後卡住了。下面是一個示例文件: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> 

我想獲得價值爲@NRO-ID-GRUPO每當@NOME-DO-GRUPO包含literatura

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 

接下來,使用正則表達式克拉的強制文本literatura如果它出現在一個字符串的開頭只匹配:

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

如果你想匹配禾RD邊界,以防止串匹配,你可以使用(^|\s),但你可能還需要增加一個尾部邊界:

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

此外,取決於有多少速度在你的應用程序非常重要,它可能是值得測試的相對性能在正則表達式匹配與標記化的BaseX中,並將上述表達式與以下表達式進行比較:

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

嘗試重寫爲'data(// IDENTIFICACAO-DO-GRUPO [matches(@ 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