我有一个这样的文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE edi_l SYSTEM "DTD_AAA_02_2013.dtd">
<edi_l>
<trader cdisp="zzzzzzz">
<idrif idrich="1111111111">
<hdr>
<odn>915000591962</odn>
<pod>IT111111111111</pod>
<presa>027292224</presa>
<cf>AAAAAAAAAAAAAAA</cf>
<piva></piva>
<tdoc>F</tdoc>
<dat>07.08.2015</dat>
<pfra>0000003.3</pfra>
<pdis>000000003.3</pdis>
<tcon>0000220</tcon>
<tf>0000000000027.59</tf>
</hdr>
<pos>
<cau>52</cau>
<scau>09</scau>
<codiva>A4</codiva>
<udm></udm>
<qta>000000000.0</qta>
<pzu>00000.000000</pzu>
<impp>000000027.59</impp>
</pos>
</idrif>
<idrif idrich="2222222222">
<hdr>
<odn>915000591962</odn>
<pod>IT222222222222</pod>
<presa>027290063</presa>
<cf>BBBBBBBBBBBBBBBBB</cf>
<piva></piva>
<tdoc>F</tdoc>
<dat>07.08.2015</dat>
<pfra>0000003.3</pfra>
<pdis>000000003.3</pdis>
<tcon>0000220</tcon>
<tf>0000000000027.59</tf>
</hdr>
<pos>
<cau>52</cau>
<scau>09</scau>
<codiva>A4</codiva>
<udm></udm>
<qta>000000000.0</qta>
<pzu>00000.000000</pzu>
<impp>000000027.59</impp>
</pos>
</idrif>
</trader>
</edi_l>
如果我执行以下操作:
SELECT XMLQUERY
('for $e in //*
where $e/pod="IT111111111111"
order by $e
return $e'
passing MS386.XML_FILE
returning content
).getClobVal()
FROM MS386_XML_TEMPLATE MS386;
我没有在输出中获得标签edi_l,trader,ecc。;该文件从标签hdr:
开始<hdr>
<odn>915000591962</odn>
<pod>IT111111111111</pod>
<presa>027292224</presa>
<cf>AAAAAAAAAAAAAAA</cf>
<piva/>
<tdoc>F</tdoc>
<dat>07.08.2015</dat>
<pfra>0000003.3</pfra>
<pdis>000000003.3</pdis>
<tcon>0000220</tcon>
<tf>0000000000027.59</tf>
</hdr>
相反,如果我执行:
SELECT XMLQUERY
('for $e in /*
where $e//pod="IT111111111111"
order by $e
return $e'
passing MS386.XML_FILE
returning content
).getClobVal()
FROM MS386_XML_TEMPLATE MS386;
它会生成所有标签,但它不会过滤容器IT111111111111(在文件中还有容器IT222222222222)。
如何生成包含所有标记的xml文件:
<?xml version = '1.0' encoding = 'UTF-8'?><!DOCTYPE edi_l SYSTEM "DTD_AAA_02_2013.dtd">
<edi_l>
<trader cdisp="zzzzzzz">
<idrif idrich="1111111111">
<hdr>
<odn>915000591962</odn>
<pod>IT111111111111</pod>
<presa>027292224</presa>
<cf>AAAAAAAAAAAAAAA</cf>
<piva/>
<tdoc>F</tdoc>
<dat>07.08.2015</dat>
<pfra>0000003.3</pfra>
<pdis>000000003.3</pdis>
<tcon>0000220</tcon>
<tf>0000000000027.59</tf>
</hdr>
<pos>
<cau>52</cau>
<scau>09</scau>
<codiva>A4</codiva>
<udm/>
<qta>000000000.0</qta>
<pzu>00000.000000</pzu>
<impp>000000027.59</impp>
</pos>
</idrif>
</trader>
</edi_l>
谢谢,
伊戈尔
答案 0 :(得分:1)
SELECT XMLQUERY
('copy $e := $doc modify
delete nodes $e/edi_l/trader/idrif[hdr/pod!="IT111111111111"]
return $e'
passing MS386.XML_FILE as "doc"
returning content
).getClobVal()
FROM MS386_XML_TEMPLATE MS386;
从原始xml中删除不需要的标签
为什么作者的方法没有正常工作。
1)首先$e in //* where $e/pod="IT111111111111"
返回每个级别的每个标记(删除位置并查看结果)。其中一个标签符合条件。
2)Secound for $e in /* $e//pod="IT111111111111"
。这个返回整个文件因为条件是真的。在某些级别的文档exsits标记“pod”,值为“IT111111111111”
答案 1 :(得分:0)
这是对ArkadiuszŁukasiewicz回复的评论;他的解决方案有助于解决我的问题。 我执行了以下查询以应用过滤器:
SELECT XMLQUERY
('copy $e := $doc modify
delete nodes $e/edi_l/trader/idrif[not(index-of(("IT111111111111","IT222222222222"),hdr/pod))]
return $e'
passing MS386.XML_FILE as "doc"
returning content
).getClobVal()
FROM MS386_XML_TEMPLATE MS386;