0

次の XML スニペットを考えると、要素の 1 つの CurrentValue が異なる場合は、変更された値ですべての CurrentValues を更新することを確認する必要がある個別の ElementID ごとに確認する必要があります。

<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>
-----
4

2 に答える 2

0

これはXSLTに適しているようです。XSLTを使用できる場合は、次の1つのオプションがあります...

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>
于 2013-02-20T06:42:38.103 に答える
0

(1) 使用される新しい値が、特定の ID の要素に表示される最後の値であると仮定すると (したがって、この回答は Daniel Haley の回答に匹敵します)、(2) 入力と出力は Daniel によって推測されたとおりになるはずです。 Haley、および (3) 入力ドキュメントがhttp://example.com/imdoc.xmlにある場合、次の XQuery モジュールのようなものがうまくいくはずです。

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>

仮定 (2) が当てはまらない場合、わずかに異なる定式化は次のようになります。

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>
于 2013-02-21T01:12:37.013 に答える