2014-05-11 4 views
0

xpath current-dateTime() 출력을 XML 요소에 저장하는 방법을 알아야합니다.어떻게 xquery를 사용하여 xml 요소에 current-dateTime()을 저장할 수 있습니까?

사용자 이름과 암호는 XForm을 통해 전달됩니다. 양식이 제출되면 action 속성은 .xquery 파일을 호출하여 양식을 처리하고이를 데이터베이스에 저장합니다.

<user> 
    <username>stewie_griffin</username> 
    <password>kill_louis</password> 
    <date_created/> 
</user> 

하지만 제가 원하는 경우 : 나는이 구조를 가지고 싶어처럼

xquery version "3.0"; 

declare namespace xmldb="http://exist-db.org/xquery/xmldb"; 
declare namespace request="http://exist-db.org/xquery/request"; 
declare option exist:serialize "method=xhtml media-type=text/html indent=yes"; 

(: Logs into the database :) 
let $login:=xmldb:login('/db/apps/example','foo','bar') 

(: Gets the data from the form :) 
let $newUser:=request:get-data() 

(: Names the file to be created :) 
let $file:=concat('user_',$newUser/user/username/text(),'.xml') 

(: Stores the file in the database :) 
let $store:= xmldb:store('/db/apps/example/users',$file,$newUser) 

return 
<html> 
    <head> 
     <title>SUCCESS!</title> 
    </head> 
    <body> 
     <b>The user: </b> {$newUser/user/usernamename/text()} <b> has been added!</b> 
    </body> 
</html> 

좋아, 이것은 잘 실행하고 좋은 XML 파일을 작성하십시오 .xquery 파일은 다음과 같다 /user/date_created 요소에 현재 날짜와 시간을 저장 하시겠습니까? 나는 그것을하는 법을 모르며 예제와 검색을 위해 거의 삼일 만 보았고 유용한 것을 찾을 수 없었습니다 ...

왜 나는 이것을 다음과 같이 할 수없는 것입니까? .xquery 파일?

$newUser/user/date_created:=current-dateTime() 

와 같이 저장된 xml 파일이?

<user> 
    <username>stewie_griffin</username> 
    <password>kill_louis</password> 
    <date_created>2006-04-10T13:40:23.83</date_created> 
</user> 

current-dateTime()의 출력을 저장하는 데 도움이 될 수 있습니까?

답변

2

$newUser/user/date_created:=current-dateTime()과 같은 작업을 수행 할 수없는 이유는 XQuery에서 대부분의 함수 언어와 마찬가지로 데이터가 변경되지 않기 때문입니다.

당신은 당신이 원하는 정보를 사용하여 새 문서를 만들 수 있습니다 : 다음

let $doc := <user>{ 
       $newUser//user/(* except date_created), 
       <date_created>{current-dateTime()}</date_created> 
      }</user> 

하고 나중에 가게() 함수, NEWUSER을 $ 문서를하지 $ 전달합니다.

XQuery Update Facility를 사용할 수도 있지만 기존의 명령형 언어로 할당 된 것처럼 업데이트를 사용하는 것이 좋습니다.

+0

고마워요. 내 xml 구조가 그보다 훨씬 복잡하기 때문에 심각한 해결 방법을 찾았습니다! 그러나 매력처럼 일했습니다. 많이 고마워요 :) – loveMeansNothing

0

@adamretter는 eXist DB가 XQuery 업데이트의 하위 세트 만 지원하고 변환 구문을 누락한다는 의견에 언급했습니다. 이 답변을 다른 데이터베이스 시스템을 사용하는 다른 방문자를위한 참고 자료로 사용하겠습니다.

C. Sperberg-McQueen의 답변 외에도 XQuery Update 버전이 여기에 변환 문을 사용합니다. 관련 두 줄은 copymodify 인 줄입니다.

(: This would be your get-data call :) 
let $newUser := 
    <user> 
     <username>stewie_griffin</username> 
     <password>kill_louis</password> 
     <date_created/> 
    </user> 
return 
    (: Copy to the same name, we don't need the old variable value any more. :) 
    (: Be aware we're not changing the variable, but cover it with a new one. :) 
    copy $newUser := $newUser 
    (: Change the date_created value with the current timestamp :) 
    modify replace value of node $newUser/date_created with current-dateTime() 
    return $newUser 

copy/modify는 업데이트 문을 사용할 수 있습니다. 왜 이것을 let을 사용할 수 없는지에 관해서는 완전히 확신 할 수 없습니다. 내 생각에 확장 프로그램에서 원래 언어를 너무 많이 변경하거나 단순히 구현자가 더 쉽게 만들거나보다 기술적 인 언어를 사용하고 싶지 않을 것입니다. 무엇이 수행되고 있는지를 분명하게 나타냅니다.

+0

안녕하세요 @ Jens Erat, 예를 들어'copy'를 설명해 주실 수 있습니까? 저는 BaseX와 Zorba에서 구현되는 것을 보았습니다.하지만 어쨌든 추천에서 볼 수 없습니다. 'let '을 사용하는 것의 차이점은 무엇입니까? –

+0

이것은 [XQuery 업데이트 변환 명령문] (http://www.w3.org/TR/xquery-update-10/#id-transform)입니다. 또한 대답에 대한 링크를 추가하겠습니다. –

+0

질문의 XQuery가 eXist-db 용이고 eXist-db가 권장 스펙이 아닌 XQuery Update 스펙의 초기 초안만을 구현하므로 구문상의 차이가있을 수 있습니다. – adamretter