这与更新XML属性的MySQL有点关系,但这次我想更新节点值。我有以下XMLfragment,这是在marcxml列:
<leader>00227nz a2200109n 4500</leader>
<controlfield tag="001">1</controlfield>
...
<controlfield tag="005">20091210091717.0</controlfield>
...
我想更新控制字段值标签001,使其成为基于查询的数字。像这样:
<leader>00227nz a2200109n 4500</leader>
<controlfield tag="001">10</controlfield>
...
<controlfield tag="005">20091210091717.0</controlfield>
...
我最初有以下mysql查询:
UPDATE auth_header SET marcxml = UpdateXML(marcxml, '//controlfield[@tag="001"]', CONCAT('<controlfield tag="001">', '10', '</controlfield>')) WHERE Extractvalue(marcxml, '//controlfield[@tag="001"]') ='169625';
表是auth_header,它有authid为主键(但我想这无关紧要),它有marcxml列,其中存储xml。查询显示受影响的行数为0。
提前感谢和干杯!
查看这里MySQL更新XML属性和MySQL站点https://dev.mysql.com/doc/refman/5.1/en/xml-functions.html#function_updatexml的讨论,查询:
UpdateXML(xml_target, xpath_expr, new_xml)
应该可以。
这个问题的xml_target是marcxml。xpath_expr是'//controlfield[@tag="001"]',这是需要编辑的节点。new_xml用于连接所需的数字和结束语句。最后,where表达式也与上面的xpath表达式相同。
因此:
UPDATE auth_header SET marcxml = UpdateXML(marcxml, '//controlfield[@tag="001"]', CONCAT('<controlfield tag="001">', '10', '</controlfield>' )) WHERE Extractvalue(marcxml, '//controlfield[@tag="001"]') ='169625';