XQuery returns 选择节点属性时没有结果
XQuery returns no results when selecting node attribute
将大约 1 GB 的 XML 数据库加载到 BaseX 中,并在阅读一些教程后卡住了。这是一个示例文档:
<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-GRUPO
包含 literatura
时获取 @NRO-ID-GRUPO
的值:
data(//IDENTIFICACAO-DO-GRUPO[matches(@NOME-DO-GRUPO,'^literatura','i')]/@NRO-ID-GRUPO)
以上查询未返回任何结果。我可能会错过什么?提前致谢。
首先,您尝试 select 的元素由 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
接下来,在正则表达式中使用 carat 会强制文本 literatura
仅匹配出现在字符串开头的文本:
matches(@NOME-DO-GRUPO,'^literatura','i')
如果您想在单词边界上进行匹配以防止子字符串匹配,您可以使用 (^|\s)
,但您可能还想添加尾随边界:
matches(@NOME-DO-GRUPO,'(^|\s)literatura($|\s)','i')
此外,根据您的应用程序对速度的重视程度,可能值得测试 BaseX 中正则表达式匹配与标记化的相对性能,并将上述表达式与以下表达式进行比较:
tokenize(lower-case(@NOME-DO-GRUPO), '\s') = 'literatura'
将大约 1 GB 的 XML 数据库加载到 BaseX 中,并在阅读一些教程后卡住了。这是一个示例文档:
<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-GRUPO
包含 literatura
时获取 @NRO-ID-GRUPO
的值:
data(//IDENTIFICACAO-DO-GRUPO[matches(@NOME-DO-GRUPO,'^literatura','i')]/@NRO-ID-GRUPO)
以上查询未返回任何结果。我可能会错过什么?提前致谢。
首先,您尝试 select 的元素由 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
接下来,在正则表达式中使用 carat 会强制文本 literatura
仅匹配出现在字符串开头的文本:
matches(@NOME-DO-GRUPO,'^literatura','i')
如果您想在单词边界上进行匹配以防止子字符串匹配,您可以使用 (^|\s)
,但您可能还想添加尾随边界:
matches(@NOME-DO-GRUPO,'(^|\s)literatura($|\s)','i')
此外,根据您的应用程序对速度的重视程度,可能值得测试 BaseX 中正则表达式匹配与标记化的相对性能,并将上述表达式与以下表达式进行比较:
tokenize(lower-case(@NOME-DO-GRUPO), '\s') = 'literatura'