XQuery не возвращает результатов при выборе атрибута узла
Загрузил базу данных XML около 1 ГБ в 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>
Я хотел бы получить значение для @NRO-ID-GRUPO
всякий раз, когда @NOME-DO-GRUPO
содержит literatura
:
data(//IDENTIFICACAO-DO-GRUPO[matches(@NOME-DO-GRUPO,'^literatura','i')]/@NRO-ID-GRUPO)
По указанному выше запросу результаты не возвращены. Чего мне не хватать? Заранее спасибо.
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')
Если вы хотите сопоставить границы слов, чтобы предотвратить сопоставление подстрок, вы можете использовать (^|\s)
, но вы также можете добавить конечную границу:
matches(@NOME-DO-GRUPO,'(^|\s)literatura($|\s)','i')
Кроме того, в зависимости от того, насколько важна скорость в вашем приложении, возможно, стоит проверить относительную производительность в BaseX сопоставления регулярных выражений с токенизацией и сравнить приведенное выше выражение с:
tokenize(lower-case(@NOME-DO-GRUPO), '\s') = 'literatura'