在数据加载中,似乎某些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属性及其关联的子字段属性)
第三个参数UpdateXML应该是新的XML片段,用它替换第二个参数中给定的XPath匹配的文档部分。
UpdateXML
您可以使用ExtractValue以下命令创建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上看到它。