2012-05-23 36 views
2

在數據加載中,似乎有些XML屬性映射不正確,現在我正在嘗試更正此問題,但是我正在努力處理MySQL對此XML列的處理。用於更新XML屬性的MySQL

我想糾正所有出現的字段(屬性'tag =「520」')與子字段(屬性'code =「3」')的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屬性,它與子字段屬性相關)

回答

2

UpdateXML的第三個參數應該是新的XML片段,用於替換第二個參數中給出的XPath所匹配的文檔部分。

您可以使用ExtractValue的XML片段:

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

+0

乾杯,我明顯誤解了UpdateXML參數的基本原理。 – Ashimema

+0

對於任何未來的讀者...我用於獲得結果的精確查詢所需物: 'UPDATE biblioitems_temp SET MARCXML =如updateXML(MARCXML, '//數據字段[@標籤= 「520」]', CONCAT(''', '', Extractvalue(marcxml,'// datafield [@ tag =」520「] /子場[@代碼= 「3」] '), ' ' '' ) ) WHERE extractValue一起(MARCXML,' //數據字段[@標籤= 「520」] /子場[@代碼= 「3」]')!='';' – Ashimema

2

您可以專門定位您希望用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查詢,因爲如果多個目標相匹配,什麼都不會被更新。 (通過測試觀察)

+0

優雅和簡單的解決方案,不需要元素是瑞瑞LT。你有沒有想過把這個貢獻給mySQL文檔Balazs?我還發現Xpath表示法''root/sub/@ att''也是可行的。 –