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'