2017-05-05 8 views
0

XML 데이터베이스를 BaseX로 1GB 정도로드하고 일부 자습서를 읽은 후에 막혔습니다. 내가 @NOME-DO-GRUPOliteratura을 포함 할 때마다 @NRO-ID-GRUPO의 값을 좀하고 싶습니다노드 속성을 선택할 때 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> 

:

data(//IDENTIFICACAO-DO-GRUPO[matches(@NOME-DO-GRUPO,'^literatura','i')]/@NRO-ID-GRUPO) 

결과가 위의 쿼리에 대해 반환 된 다음은 샘플 문서입니다. 나는 무엇을 놓칠 수 있 었는가? 미리 감사드립니다.

+0

대문자 문제 일 수 있습니까? '문학 작품 대'문학 작품? – SmartDev

+0

대문자 L로 바뀌었지만 작동하지 않았습니다 ... – wlwy

답변

1

먼저 선택하려는 요소의 이름 공간은 xmlns="http://www.cnpq.br/lmpl/2002/XSD/Grupo"입니다.

declare namespace grupo = "http://www.cnpq.br/lmpl/2002/XSD/Grupo" 

그리고 당신의 표현에 접두사를 사용하여 요소를 참조하십시오 : 당신은 그 네임 스페이스를 선언하고 XQuery를 모듈의 프롤로그에 그것을 접두사를 할당해야합니다

//grupo:IDENTIFICACAO-DO-GRUPO 

다음의 정규 표현식에서 캐럿의 사용은 문자열의 시작 부분에 나타나는 경우에만 일치하는 텍스트 literatura 강제 :

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

당신은 WO에 일치 시키려면 그것은 상대적인 성능을 테스트 할 가치가있을 수도 있습니다 응용 프로그램에서 중요 얼마나 속도에 따라, 또한

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

: RD 경계는 (^|\s)을 사용할 수 있습니다 일치하는 부분 문자열 방지하기 위해,하지만 당신은 또한 후행 경계를 추가 할 수 있습니다 정규 표현식 일치 vs 토큰 화의 BaseX에서 위의 표현식을 다음과 비교하십시오.

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

데이터 형식으로 다시 쓰려고 시도했습니다 (IDENTIFICACAO-DO-GRUPO [@ 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