0

鉴于以下 XML 片段,对于我需要检查的每个不同 ElementID,如果其中一个元素中的 CurrentValue 不同,则使用更改的值更新所有 CurrentValues。

<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,这里有一个选项...

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 回答