2011-08-13 8 views
1

학교용 프로젝트를 진행 중입니다. 이 프로젝트는 내가 XML의 다양한 처리 기술을 사용할 수 있음을 보여줄 것을 요청합니다. 이제는 내 프로젝트에서 사용자 기록을 유지하는 Sedna 데이터베이스 관리자와 작업하며 XQuery를 통해 이러한 사용자 레코드 중 일부를 업데이트하고 싶습니다. (저는 PHP API를 사용하여 PHP API를 통해 데이터베이스에 쿼리를 보냅니다. Sedna 개발자 팀). 나는 사용자 레코드에 대한 다음과 같은 데이터베이스의 내용이 상상 : 내 의도는 여기 지금XQuery Update Sedna에서 바꾸기

<?xml version="1.0" encoding="UTF-8"?> 

<users> 
    <user id="admin" admin="true"> 
     <email>[email protected]</email> 
     <password>123456789</password> 
     <firstname>The</firstname> 
     <lastname>Stig</lastname> 
     <gender>male</gender> 
     <subscriptions> 
     </subscriptions> 
    </user> 
    <user id="prosper" admin="false"> 
     <email>[email protected]</email> 
     <password>123456789</password> 
     <firstname>Strange</firstname> 
     <lastname>Figure</lastname> 
     <gender>male</gender> 
     <subscriptions> 
     </subscriptions> 
    </user> 
</users> 

하는 것은, 예를 들어, 업데이트의 userrecord 번영하는 것입니다. 이 기록에서 저는 예를 들면, 그의 성명과 이메일을 바꾸고 싶지만, 나머지는 그대로 유지하고 싶습니다. 다음 쿼리를 사용하려고했지만 쿼리를 보낸 후 사용자 레코드의 특성 노드를 자식 노드로 삽입한다고 생각하는 이유 때문에 userrecord의 문서 순서가 변경됩니다. 이 내가 사용자 업데이트하는 데 사용하는 쿼리입니다 : 이제

UPDATE replace $user in doc("users")//user[@id="prosper"] 
with 
<user>{($user/@*)} 
<email>[email protected]</email> 
{($user/node()[password])} 
<firstname>Familiar</firstname> 
<lastname>Figure</lastname> 
<gender>male</gender> 
{($user/node()[subscriptions])}</user> 

을,이 쿼리가, 나에게주는 문제는 업데이트 후 사용자의 정보를 요청하려고 할 때, 나는 아이의 순서에 의존한다는 것입니다 노드는 업데이트 전에 있었지만이 쿼리는 순서를 변경합니다.

이 문제를 해결할만큼 숙련 된 전문가가 있습니까?

시간 내 주셔서 감사합니다.

+0

J 귀하의 예제가 작동합니다 (교체 후 사용자 요소 간 문서 순서가 보존 됨). Sedna 3.4.66. 문제를 재현 할 수있는 다른 세부 정보를 제공 할 수 있습니까? – Shcheklein

+0

안녕하세요. 사용자 레코드 간의 문서 순서는 실제로 유지되지만 문제는 업데이트 된 userrecord 내에 있습니다. PHP 스크립트로 사용자의 정보를 입력 할 수있는 양식이 있습니다. 사용자는이 정보를 업데이트하고 저장할 수 있습니다. 그러나 업데이트 후에 동일한 양식을 표시 할 때 사용자의 정보가 올바르게 표시되지 않습니다. 업데이트가 수행 된 후 첫 번째 이름이 있어야하는 텍스트 영역에서 성이 채워지고 성이 있어야하는 텍스트 영역에 성별이 입력됩니다. 그래서 userrecord 내부의 내용이 변경되어 볼 수 없습니다. 왜. –

+0

1 월, 내 대답을 참조하십시오. 어쨌든, 필드와 값을 어떻게 바인딩합니까? – Shcheklein

답변

0

당신이 password 노드 당신이 당신의 XPath를 변경해야합니다 얻으려면 월은 (현재 표현 {($user/node()[password])} 당신이 생각하는 것이 아닙니다) : subscriptions에 대해 같은 사실

{$user/password} 

:

{$user/subscriptions} 

술어를 사용하여 하나의 표현식으로 작성할 수 있습니다.

{$user/node()[local-name(.) = ('password', 'subscriptions')]} 
+0

당신이 옳습니다. 나는 $ user/node() [password]가 의미하는 바를 모르고 있었다. 나는 sedna 문서 웹 페이지에서 찾은 것에 대한 쿼리를 기반으로합니다. 당신의 솔루션은 잘 작동합니다. 당신의 도움을 주셔서 대단히 감사합니다. –