2016-01-13 24 views
2

这里一个新的XML元素 一个开放的XML文档中替换 元素是XML文档的样本之前,我跑我的XQuery:

<?xml version="1.0" encoding="UTF-8" standalone='yes'?> 
<w:document xmlns:ve="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml"> 
    <w:body> 
    ... 
<w:p w:rsidR="00BB265E" w:rsidRDefault="00BB265E"> 
    <w:pPr> 
    <w:pStyle w:val="DefaultText"/> 
    <w:ind w:left="720" w:hanging="720"/> 
    </w:pPr> 
    <w:r> 
    <w:t>1.7</w:t> 
    </w:r> 
    <w:r> 
    **<w:tab/>** 
    </w:r> 
    <w:r w:rsidRPr="001C1D1B"> 
    <w:rPr> 
     <w:shd w:val="clear" w:color="auto" w:fill="FABF8F"/> 
    </w:rPr> 
    <w:t>Member means any person who is enrolled in</w:t> 
    </w:r> 
... 

下面是一些我尝试了XQuery查询运行:

查询1

UPDATE XML_TORTEST 
    SET XMLDOC = updateXML(XMLDOC,'declare namespace w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"; /w:document/w:body/w:p/w:r/w:tab', 
        XMLType('<w:t> </w:t>')) 
    WHERE XML_TORTEST_ID = 1 
AND XMLExists('$p/w:document/w:body/w:p/w:r/w:tab' 
        PASSING XMLDOC AS "p");  

这给出了这样的错误:

SQL错误:ORA-31013:无效的XPATH表达式 31013. 00000 - “无效的XPATH表达式” *原因:传递给函数的XPATH表达式无效。 *操作:检查xpath表达式是否有可能的语法错误。我想与使用XQuery

查询2 - 工作,但XML输出不正确(不是真的)

UPDATE XML_TORTEST po 
    SET po.XMLDOC = 
    XMLQuery('declare namespace w="http://schemas.openxmlformats.org/wordprocessingml/2006/main";  
       copy $i := $p1 
       modify 
       (
      for $j in $i/w:document/w:body/w:p/w:r/w:tab 
      let $newn := ''<w:t> </w:t>'' 
      return replace node $j with $newn) 
      return $i' PASSING po.XMLDOC AS "p1" 
      RETURNING CONTENT) 
WHERE XML_TORTEST_ID = 1 
AND XMLExists('declare namespace w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"; $p/w:document/w:body/w:p/w:r/w:tab' 
       PASSING po.XMLDOC AS "p"); 

下面是示例XML后,我跑了查询2:

<w:p w:rsidR="00BB265E" w:rsidRDefault="00BB265E"> 
     <w:pPr> 
     <w:pStyle w:val="DefaultText"/> 
     <w:ind w:left="720" w:hanging="720"/> 
     </w:pPr> 
     <w:r> 
     <w:t>1.7</w:t> 
    </w:r> 
    **<w:r>&lt;w:t&gt; &lt;/w:t&gt;</w:r>** 
    <w:r w:rsidRPr="001C1D1B"> 
    <w:rPr> 
     <w:shd w:val="clear" w:color="auto" w:fill="FABF8F"/> 
    </w:rPr> 
    <w:t>Member means any person who is enrolled in</w:t> 
    </w:r> 
    .... 

任何帮助的&lt;w:t&gt; &lt;/w:t&gt;转换到<w:t> </w:t>表示赞赏。

回答

0

尝试let $newn := <w:t> </w:t>而不是let $newn := ''<w:t> </w:t>''

+0

如果我删除了',改变$ newn:= 被替换为没有。 – tstorli

0

你要加魔法字(#ora:invalid_path empty #)更多信息here款“甲骨文的XQuery拓表达编译指示”

UPDATE XML_TORTEST po 
    SET po.XMLDOC = 
    XMLQuery(' 
      declare namespace w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"; 
       (#ora:invalid_path empty #){ 
       copy $i := $p1 
       modify 
       (
      for $j in $i/w:document/w:body/w:p/w:r/w:tab 
      let $newn := <w:t></w:t> 
      return replace node $j with $newn) 
      return $i 
      } 
      ' PASSING XMLDOC AS "p1" 
      RETURNING CONTENT); 
+0

我尝试了上面的更新语句,但没有运气。它创建一个空的文本节点。这样' 1.7 '我需要一个有一个空间字符在里面。 – tstorli

+0

我可以创建一个节点,但前提是我需要在其中添加一个值。就像这样:'UPDATE XML_TORTEST婆... ... 让 $ newn:= ### 回报替换$ newn节点$ j)的 回归$ I}” PASSING po.XMLDOC AS “P1” 返回内容) WHERE XML_TORTEST_ID = 1 ...'但现在我必须找到一种方法来删除###个字符,以便只剩下空间。 – tstorli

+0

'select xmlquery('let $ spaceChar:=“ ”return {$ spaceChar}'returns content)from dual;'试试这个。也许你可以从代码中删除(#ora:invalid_path empty#) –