Oracle XQuery过滤器和标签

时间:2015-08-31 10:09:33

标签: xml oracle xquery

我有一个这样的文件:

<?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>

谢谢,
伊戈尔

2 个答案:

答案 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;