2

データの読み込みでは、一部のXML属性が正しくマッピングされていないようで、これを修正しようとしていますが、MySQLによるこのXML列の処理に苦労しています。

サブフィールド(属性'code = "3"')を持つフィールド(属性'tag = "520"')のすべてのオカレンスのXML属性(値ではない)を修正したいと思います。以下のクエリは、影響を受けた0行、見つかった1行を返します。これを達成する方法に関する手がかり。

UPDATE biblioitems
SET marcxml = UpdateXML(marcxml,'datafield[@tag="520"]/subfield[@code="3"]',
                     'datafield[@tag="520"][@ind1="3"]/subfield[@code="a"]')
WHERE biblionumber = '220405';

明確にするために含まれているXMLフラグメント:

元のフラグメント

<datafield tag="300" ind1=" " ind2=" ">
  <subfield code="f">article</subfield>
</datafield>
<datafield tag="520" ind1=" " ind2=" ">
  <subfield code="3">A description of something here</subfield>
</datafield>
<datafield tag="655" ind1=" " ind2=" ">
  <subfield code="a"></subfield>
</datafield>

結果として私が欲しいもの:

<datafield tag="300" ind1=" " ind2=" ">
  <subfield code="f">article</subfield>
</datafield>
<datafield tag="520" ind1="3" ind2=" ">
  <subfield code="a">A description of something here</subfield>
</datafield>
<datafield tag="655" ind1=" " ind2=" ">
  <subfield code="a"></subfield>
</datafield>

コードブロックの変更を強調表示する方法を理解できませんでした(これは、tag = "520"データフィールドのind1属性であり、関連するサブフィールド属性です)

4

3 に答える 3

3

attribute::att軸を使用して書き換えたい属性を具体的にターゲットにすることができます。

動作を検証するためのMySQLコードの例

SELECT UpdateXML('<root><sub att="foo" xatt="bar">Content Text</sub><sec att="etc">Container</sec></root>', '/root/sub/attribute::att', 'att="something"')

クエリの結果は次のようになります

<root><sub att="something" xatt="bar">Content Text</sub><sec att="etc">Container</sec></root>

複数のターゲットが一致した場合、何も更新されないため、XPATHクエリで具体的にすることを忘れないでください。(それをテストすることによって観察された)

于 2016-07-29T07:01:47.140 に答える
2

の3番目の引数UpdateXMLは、2番目の引数で指定されたXPathと一致するドキュメントの部分を置き換える新しいXMLフラグメントである必要があります。

以下を使用してXMLフラグメントを作成できますExtractValue

UPDATE biblioitems
SET    marcxml = UpdateXML(marcxml,
         'datafield[@tag="520"]',
         CONCAT(
           '<datafield tag="520" ind1="a" ind2="',
              ExtractValue(marcxml, 'datafield[@tag="520"]/attribute::ind2'),
           '">',
           '  <subfield code="a">',
             ExtractValue(marcxml, 'datafield[@tag="520"]/subfield'),
           '  </subfield>',
           '</datafield>'
         )
       )
WHERE  biblionumber = 220405;

sqlfiddleでそれを参照してください。

于 2012-05-23T11:45:00.560 に答える
0

UPDATE biblioitems SET marcxml = UpdateXML(marcxml,'datafield[@tag="520"]/subfield[@code="3"]/@code', 'code="a"') WHERE biblionumber = '220405';

UpdateXML関数では、既存のノードを見つける必要があることに注意してください。属性を挿入する場合は、既存の属性を複数の属性に置き換える必要があります。たとえば、属性dをx要素に挿入するには: select updateXML('<x a="aaa" b="bbb">xxxxxx<c>cccc</c></x>', 'x/@a', 'a="aaa" d="ddd"')

于 2018-07-20T13:16:39.520 に答える