2012-03-06 2 views
2

놀랍게도, 아주 기본적인 XQuery 질문, 즉 주요 XQuery 모듈과 가져온 라이브러리 모듈간에 전역 변수를 공유하는 올바른 방법은 무엇입니까? 간단히 말해 전역 변수를 어디에서나 (즉, (가져온) 모든 XQuery 모듈에서) 재사용 할 수있는 어딘가에 정의하고 싶습니다. 그런 변수를 선언하기 가장 좋은 곳을 찾기 위해 고심하고 있습니다.XQuery : (가져온) 모듈에서 전역 변수 공유

  • global.xq :

    module namespace global="global"; 
    
    declare variable $global:test := 'global!'; 
    
  • TEST2 라이브러리 모듈 다음

    import module namespace global="global" at "global.xq"; 
    import module namespace test2="test2" at "test2.xq"; 
    
    declare variable $test := 'test!'; 
    
    test2:echo() 
    

    이 모듈 수입 :

    가정하자 나는 주요 XQuery를 (test.xq를) 다음 한 .xq : 모듈 네임 스페이스 test2 = "test2";

    import module namespace global="global" at "global.xq"; 
    
    declare function test2:echo() { 
        $global:test 
    }; 
    

이 작동하지만 몇 가지 질문으로 나를 잎 :

  • 그것을 할 수있는 방법이 있나요 :

    • 하는 글로벌 변수를 정의 (예 : $ 글로벌 : 테스트를) 별도의 라이브러리 모듈 (예 : global.xq)
    • 모듈을 가져올 필요가있는 곳으로 가져 오기 변수에 대한 액세스

    ?

  • 가져온 라이브러리 모듈 (예 : test2.xq)에서 기본 XQuery 모듈 (예 : $ test)에 선언 된 변수에 액세스하는 방법이 있습니까?

누구든지이 문제에 관해 밝힐 수 있습니까? 나는 내가 왜이 개념과 맞서 싸우고있는 주된 이유가 무엇인지는 짐작한다. 왜냐하면 나는 어쩌면 그것보다 느슨한 eXist의 행동에 익숙하기 때문이다. global.xq 모듈 가져 오지 않고 테스트 변수 : 존재에서 test2.xq 모듈은 단지 $ 글로벌 참조 할 수 있습니다이 존재에서 작동하기 때문에

module namespace test2="test2"; 
declare namespace global="global"; 

declare function test2:echo() { 
    $global:test 
}; 

을하지만 색슨에, 나는 무엇인지 궁금 시작 (가져온) XQuery 모듈에서 전역 변수를 정의하고 사용하는 올바른 방법.

종류와 관련,

답변

3

분명히 존재가 당신은 또한 /이의 포함 수입을 통해 현재 모듈 외부에 선언 된 변수 및 매개 변수를 참조 할 수 있습니다 XSLT.In에서 당신에게 익숙 할 수있는 접근 방식을 취하고 'ancestor'모듈 (포함/가져 오기 체인에서 더 높음).

내 지식은 XQuery 표준을 준수하지 않습니다!

분명히 이것을 사용할 수있는 것은 사실이지만 그렇게하지 않는 데는 몇 가지 좋은 이유가 있습니다.이상적으로 모듈은 자체 포함 된 재사용 가능한 구성 요소이며 이러한 외부 매개 변수/변수에 의존 할 때 더 이상 적합하지 않습니다. 문맥 정보를 매개 변수로 전달하는 것이 더 좋습니다. 항상 우아한 것처럼 보이지는 않지만 결국에는 더 나은 디자인입니다.

일부 구현은 변수 값의 재정의를 사용하는 대체 옵션을 제공합니다. MarkLogic은 xdmp : set 명령을 가지고 있으며 saxon도 변수 할당을 가지고 있다고 생각합니다 (또는 XSLT에있는 것입니까?). 이를 사용하여 모듈을 '초기화'할 수 있습니다. 모듈은 객체가 아니기 때문에 마음에 듭니다. 따라서 이러한 접근 방식을 사용하여 statefull 정보를 유지하는 것은 피하십시오. 또한 특정 구현 기능에 의존한다는 의미이기도합니다. 업데이트 기능을 사용할 수 없다면 그런 식으로 작동하도록 의도 된 것인지 확실하지 않습니다.

+0

의견을 보내 주셔서 감사합니다. 나는 비표준 행동에 근거한 가정에 부딪쳤을지도 모른다는 것을 잘 알고있다. 그러나 그러한 디자인 패턴과 관련하여 웹에서 유용한 힌트를 찾을 수 없었습니다. 나는 그런 기본적인 필요를위한 공급자 특정 확장을 좋아하지 않는다. 전역 변수를 모든 (가져 오기) XQuery 모듈에 액세스 가능하게하는 표준 방법으로 원래의 질문 (예 : 전용 라이브러리 모듈에서 전역 변수를 정의하고 필요에 따라 가져 오기)에서 작업 방식을 권장 하시겠습니까? 아니면 다른 (준수) 가능성을 보시겠습니까? – rvdb

+1

@rvdb 각 호출에 매개 변수를 통해 이러한 값을 전달하는 것이 좋습니다. 아주 작은 컨텍스트 정보를 작은 XML 조각으로 모으고이를 전달하는 것은 매우 쉽습니다. 그것은 가장 확장 성이 뛰어나며 가장 깨끗합니다. 내가 설명한 행동의 초기화 종류를 원할 이유가 없다면, 당신이했던 것처럼 공유 전역 모듈을 가져 오는 것이 가장 현명한 다른 방법입니다. HTH! – grtjn

1

입니다. 실제 사용 사례에서이 "변수"는 무엇입니까? 그 이름에서 알 수 있듯이, 그들은 변화 할 수 있어야합니까? (그렇다면 문서에 넣는 것이 옳은 일일 수 있습니다.) 그것들이 단지 상수라면, 접근 방식을 단일 모듈/네임 스페이스에 넣고 필요에 따라 가져 오는 것이 옳은 일일 것입니다.

솔직히 모듈을 작성하여 다른 곳에 정의 된 것으로 가정하고 다른 곳에서 정의해야하는 위치를 정의하지 않으면 위험한 경향이 있습니다. 다른 이유가 없으면 독자가 해당 모듈을 따르는 것이 더 어려워집니다. 제어 흐름. 따라서, 나는 그 행동이 바람직한 이유에 대해 약간 불분명하다.

구성을 문서에 캡슐화하고 해당 문서를 함수 호출의 인수로 전달하는 것을 고려하십시오.

+0

아니요, 그들은 상수입니다. 제네릭 코드에서 사용할 수있는 응용 프로그램 별 값을 포함하는 구성 파일에 대해 더 생각하고 있습니다. 그런 다음 일반 코드는 각각의 구성 값을 가진 여러 앱에 대해 서비스를 제공 할 수 있습니다. 내가 언급 한 eXist 행동에 대한 두 번째 발언이 맞습니까? 어떤 경우에는 동의합니다. 차라리 사양을 준수하는 경로를 택할 것입니다. – rvdb

+0

@rvdb - ahh, gotcha. 구성 값을 입력하기위한 나의 개인적인 접근법은 구성 문서를 통해 주입하는 것이며 이러한 값을 필요로하는 모든 호출에 매개 변수로 전달됩니다. 지금 당장은이 문서를 데이터베이스에 저장하는 것이 아니라 컨텍스트 매개 변수로 실제 호출에 전달합니다. 특정 접근법은 장기간에 판매 될지 잘 모르지만 ... 방법, 암시 적보다 낫다. –

+0

@rvdb ... 실제로, grtjn이 독립적으로 동일한 접근법을 제안하는 것처럼 보입니다. 나는 내 자신의 사용을 입증/유효성 확인의 몇 가지 수준으로 읽고 있어요. :) –