【问题标题】:I would like to replace a <w:tab /> element with a new xml element <w:t> </w:t> in a Open XML document using XQuery我想使用 XQuery 在 Open XML 文档中用新的 xml 元素 <w:t> </w:t> 替换 <w:tab /> 元素
【发布时间】:2016-01-13 20:18:47
【问题描述】:

这是我运行 XQueries 之前的 XML 文档示例:

<?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 表达式是否有可能的语法错误。

查询 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");

这是我运行查询 2 后的示例 XML:

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

感谢任何将&amp;lt;w:t&amp;gt; &amp;lt;/w:t&amp;gt; 转换为&lt;w:t&gt; &lt;/w:t&gt; 的帮助。

【问题讨论】:

    标签: xml oracle xpath xquery-sql


    【解决方案1】:

    尝试let $newn := &lt;w:t&gt; &lt;/w:t&gt; 而不是let $newn := ''&lt;w:t&gt; &lt;/w:t&gt;''

    【讨论】:

    • 如果我删除 '' 并更改 $newn := 将被替换为任何内容。
    【解决方案2】:

    你必须添加魔法词(#ora:invalid_path empty #)。更多信息here段落“Oracle XQuery Extension-Expression Pragmas”

    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);
    

    【讨论】:

    • 我尝试了上面的更新语句,但没有运气。它创建一个空文本节点。像这样&lt;w:r&gt; &lt;w:t&gt;1.7&lt;/w:t&gt; &lt;/w:r&gt; &lt;w:r&gt; &lt;w:t xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"/&gt; &lt;/w:r&gt; 我需要一个有空格字符的。
    • 我可以创建一个节点,但前提是我在其中输入了一个值。像这样:` UPDATE XML_TORTEST po ... ... let $newn := ### return replace node $j with $newn) return $i}' PASSING po.XMLDOC AS "p1" RETURNING CONTENT) WHERE XML_TORTEST_ID = 1 ...` 但是现在我必须找到一种方法来删除 ### 字符,以便只保留空格。
    • select xmlquery('let $spaceChar:= "&amp;#32;" return &lt;aaa&gt;{$spaceChar}&lt;/aaa&gt;' returning content) from dual; 试试这个。也许你可以从代码中删除 (#ora:invalid_path empty #)
    猜你喜欢
    • 1970-01-01
    • 2014-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 2020-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多