2013-02-20 2 views
0

다음 XML 조각에서 각 요소 ID에 대해 요소 중 하나의 CurrentValue가 다르면 변경된 값으로 모든 CurrentValues를 업데이트해야합니다.XQUERY를 사용하여 XML 매개 변수를 업데이트하십시오.

<im:Element> 
    <im:ElementID>1</im:ElementID> 
    <im:CurrentValue>OldValue1</im:CurrentValue> 
</im:Element> 
<im:Element> 
    <im:ElementID>1</im:ElementID> 
    <im:CurrentValue>OldValue1</im:CurrentValue> 
</im:Element> 
<im:Element> 
    <im:ElementID>1</im:ElementID> 
    <im:CurrentValue>NewValue1</im:CurrentValue> 
</im:Element> 
<im:Element> 
    <im:ElementID>2</im:ElementID> 
    <im:CurrentValue>OldValue2</im:CurrentValue> 
</im:Element> 
<im:Element> 
    <im:ElementID>2</im:ElementID> 
    <im:CurrentValue>NewValue2</im:CurrentValue> 
</im:Element> 
<im:Element> 
    <im:ElementID>2</im:ElementID> 
    <im:CurrentValue>OldValue2</im:CurrentValue> 
</im:Element> 
----- 

결과

<im:Element> 
    <im:ElementID>1</im:ElementID> 
    <im:CurrentValue>NewValue1</im:CurrentValue> 
</im:Element> 
<im:Element> 
    <im:ElementID>1</im:ElementID> 
    <im:CurrentValue>NewValue1</im:CurrentValue> 
</im:Element> 
<im:Element> 
    <im:ElementID>1</im:ElementID> 
    <im:CurrentValue>NewValue1</im:CurrentValue> 
</im:Element> 
<im:Element> 
    <im:ElementID>2</im:ElementID> 
    <im:CurrentValue>NewValue2</im:CurrentValue> 
</im:Element> 
<im:Element> 
    <im:ElementID>2</im:ElementID> 
    <im:CurrentValue>NewValue2</im:CurrentValue> 
</im:Element> 
<im:Element> 
    <im:ElementID>2</im:ElementID> 
    <im:CurrentValue>NewValue2</im:CurrentValue> 
</im:Element> 
----- 
+0

이것은 XSLT에 더 적합한 것 같다. XSLT를 사용할 수 있습니까? –

+1

요소 ID와 값이 다른 여러 개의 im : Element 요소가있는 경우 어떤 요소가 변경되어 새로운 값을 포함하는지 어떻게 알 수 있습니까? 시퀀스의 마지막 값을 해당 요소 유형의 모든 항목에 전파해야합니까? 아니면 새 값이 모두 "NewValue"문자열로 시작하는 키입니까? –

+0

요소에 대해 newValue를 찾는 방법은 해당 elementID의 모든 항목에서 값과 다른 유일한 값을 확인하는 것입니다. – cornerstone

답변

0

이것은 XSLT에 더 적합한 것이어야한다. 당신은 XSLT를 사용할 수있는 경우, 여기에 하나 개의 옵션 ...

XML 입력는 (잘 형성되는 수정)의

<im:Doc xmlns:im="im"> 
    <im:Element> 
     <im:ElementID>1</im:ElementID> 
     <im:CurrentValue>OldValue1</im:CurrentValue> 
    </im:Element> 
    <im:Element> 
     <im:ElementID>1</im:ElementID> 
     <im:CurrentValue>OldValue1</im:CurrentValue> 
    </im:Element> 
    <im:Element> 
     <im:ElementID>1</im:ElementID> 
     <im:CurrentValue>NewValue1</im:CurrentValue> 
    </im:Element> 
    <im:Element> 
     <im:ElementID>2</im:ElementID> 
     <im:CurrentValue>OldValue2</im:CurrentValue> 
    </im:Element> 
    <im:Element> 
     <im:ElementID>2</im:ElementID> 
     <im:CurrentValue>OldValue2</im:CurrentValue> 
    </im:Element> 
    <im:Element> 
     <im:ElementID>2</im:ElementID> 
     <im:CurrentValue>NewValue2</im:CurrentValue> 
    </im:Element> 
</im:Doc> 

XSLT 1.0

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:im="im"> 
    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="im:CurrentValue"> 
     <xsl:copy> 
      <xsl:value-of select="(//im:Element[im:ElementID=current()/../im:ElementID]/im:CurrentValue)[last()]"/> 
     </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

XML 출력

<im:Doc xmlns:im="im"> 
    <im:Element> 
     <im:ElementID>1</im:ElementID> 
     <im:CurrentValue>NewValue1</im:CurrentValue> 
    </im:Element> 
    <im:Element> 
     <im:ElementID>1</im:ElementID> 
     <im:CurrentValue>NewValue1</im:CurrentValue> 
    </im:Element> 
    <im:Element> 
     <im:ElementID>1</im:ElementID> 
     <im:CurrentValue>NewValue1</im:CurrentValue> 
    </im:Element> 
    <im:Element> 
     <im:ElementID>2</im:ElementID> 
     <im:CurrentValue>NewValue2</im:CurrentValue> 
    </im:Element> 
    <im:Element> 
     <im:ElementID>2</im:ElementID> 
     <im:CurrentValue>NewValue2</im:CurrentValue> 
    </im:Element> 
    <im:Element> 
     <im:ElementID>2</im:ElementID> 
     <im:CurrentValue>NewValue2</im:CurrentValue> 
    </im:Element> 
</im:Doc> 
+0

NewValue *는 반드시 마지막 요소 여야합니다. – cornerstone

0

(1) 사용되는 새로운 값이 주어진 ID의 요소에 나타나는 마지막 값이므로 (이 대답은 Daniel Haley의 것과 유사합니다), (2) 입력 및 출력이 추측되는 것으로 가정합니다 Daniel Haley의 (3) 입력 문서가 http://example.com/imdoc.xml 인 경우, 다음 XQuery 모듈과 같은 것이 트릭을 수행해야합니다. 가정 (2) 적용되지 않는 경우

declare namespace im = "im"; 

<im:Doc>{ 
    let $doc := doc('http://example.com/imdoc.xml') 
    for $e in $doc/im:Doc/im:Element 
    let $eid := $e/im:ElementID, 
     $lastval := ($e/../im:Element[im:ElementID = $eid]) 
        [last()] 
        /im:CurrentValue 
    return <im:Element>{ $eid, $lastval}</im:Element> 
}</im:Doc> 

, 약간 다른 공식은 다음과 같습니다

let $input := doc('http://example.coms/imdoc.xml') 
        /im:Doc/im:Element 
for $e in $input 
let $eid := $e/im:ElementID, 
    $lastval := ($input[im:ElementID = $eid]) 
       [last()]/im:CurrentValue 
return <im:Element>{ $eid, $lastval}</im:Element> 
+0

NewValue *는 반드시 마지막 요소 일 필요는 없습니다. – cornerstone

+0

그러면 어떤 요소가 "최신"이라고 생각합니까? –

+0

요소의 최신 값을 찾는 방법은 해당 elementID의 모든 항목 중에서 값과 다른 유일한 값을 확인하는 것입니다. – cornerstone

관련 문제