2017-05-05 91 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