2017-03-16 4 views
2

내 문제의 예제를 찾을 수 없으므로 여기에 내 질문이 있습니다. 내가 다른 다음 예에서 예기치 않은 토큰 오류를 얻을 :(XQuery/Conditions) if 문에서 변수를 선언 할 수 있습니까?

let $var1 := 'true' 
if ($var1 = 'true') then 
    let $var2 := 1 
    let $var3 := $var1 + 1 
else() 

당신이 나는 경우 문에 해당하는 경우 변수를 선언 할시피. XQuery에서 가능합니까? 방금 한 변수의 값이 조건에 달려있는 예제를 보았습니다. 다음은 다소 복잡합니다. 처음에는 코드로 실현하고 싶습니다. 작동하지만 약간 혼란 스럽습니다. 사실 조건이 아니라면 변수를 만들지는 않을 것입니다. 참된. 더욱이, 서로 의존하는 변수가 2 개 이상일 때 특히 그렇다는 것을 깨달을 때 생각해야합니다.

let $var1 := 'true' 
let $var2 := if ($var1 = 'true') then (1) else (0) 
let $var3 := if ($var2 = 1) then ($var2 + 1) else (0) 

그럼 내 질문은. 내 솔루션보다 실현하기에 더 좋은 해결책이 있습니까?

답변

1

return 절을 추가하여 조건 내에 전체 flwor 표현식을 넣을 수 있습니다. 이 같은 :

let $var := 'true' 
if ($var = 'true') then 
    let $var2 := 1 
    let $var3 := $var1 + 1 
    return 0 
else() 

하지만 무의미 다음 $ VAR2 및 $ VAR3의 결합은 다음 조항의 범위의 외부를 확장하지 않을 것입니다.

1

XQuery는 변수가 할당되지 않고 특정 범위 내에서만 바인딩된다는 의미의 선언적 및 기능적 언어입니다. 이것은 XQuery 프로그램에 시간이 없으므로 시간이 아닌 공간의 관점에서 생각해야하는 것입니다. 티켓으로 박물관을 방문 할 수는 있지만 다른 박물관을 방문 할 수는 없습니다.

let 절은 FLWOR (for-let-where-orderby-return의 약어) 표현식의 일부입니다. let 절에 바인드 된 변수는 return 절까지의 후속 절에서 사용될 수 있습니다. mholstege가 설명했듯이, 필요하지 않은 return 절을 넘어서는 변수는 더 이상 보이지 않습니다. 아무도 박물관 외부에서 티켓을 수령하지 않는 것처럼 말입니다. if-then-else 발현이 then (또는 else) 식 종료 전에 return 절 존재할 것을 요구 내부

는 XQuery를 문법에 따른 "잘 괄호"방식으로 표현 둥지 때문에, 시도는 let 절을 시작한다. 즉,이 방법으로 바인딩 된 변수는이 if-then-else 표현 뒤에 표시되지 않습니다. 일반적으로

, 나는 (반대에, 자바 말), 내가 원하는 것을를 기록하고 방법 I을 설명하는 유혹에 저항하기 위해 지속적으로 내가 가진 것을 나 자신을 생각 나게하는 시도는 XQuery로 프로그래밍 할 때 계산하길 원해.

XQuery에는 설명대로 변수 할당을 도입하는 scripting extensions이 있지만 지금까지는 표준화되지 않았으며 외부 스크립팅 확장은 외부 세계에 대한 부작용이 발생했을 때만 사용해야합니다. 그것은 시간의 개념과 스냅 샷을 필요로한다는 것입니다.

0
당신은 당신의 가능한 값 시퀀스를 정의하여/다른 아예 경우 사용하지 않도록 할 수

및 순서에서 원하는 값을 선택합니다 position()을 계산하는 술어 :

다음은의 숫자 값을 평가하는 number()를 사용을 부울 (false의 경우 0, 참인 경우 1) 값의 순서에서 첫 번째 또는 두 번째 항목을 선택합니다.

let $var1 := 'true' 
let $var2 := (0, 1)[number($var1 = 'true') + 1] 
let $var3 := (0, $var2 + 1)[number($var2 eq 1) + 1] 
return ($var1, $var2, $var3)