在数据加载中,似乎某些XML属性映射不正确,我现在正在尝试纠正此问题,但是MySQL对此XML列的处理正在苦苦挣扎。
我想更正所有出现的字段(属性"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 属性及其关联的子字段属性)
您可以使用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 查询中要具体,因为如果多个目标匹配,则不会更新任何内容。(通过测试观察)
> 要UpdateXML
的第三个参数应该是新的 XML 片段,用于替换与第二个参数中给出的 XPath 匹配的文档部分。
创建 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上看到它。
UPDATE biblioitems
SET marcxml = UpdateXML(marcxml,'datafield[@tag="520"]/subfield[@code="3"]/@code',
'code="a"')
WHERE biblionumber = '220405';
请注意,UpdateXML 函数需要找到现有节点。如果要插入属性,则必须将现有属性替换为多个属性。例如,要在 X 元素中插入属性 D: select updateXML('<x a="aaa" b="bbb">xxxxxx<c>cccc</c></x>', 'x/@a', 'a="aaa" d="ddd"')