2014-12-02 57 views
0

這是您的專家的XPath/OOXML問題。OOXML中的XPath

我有一個MSOffice docx,帶有不同顏色的高亮顯示的文本,我必須將其轉換爲XML,然後使用XPath標識所有高亮顯示的內容,而不考慮顏色,以便可以用XML規則對它們進行過濾。

下面是一個例子如何看起來的MSWord

enter image description here

我明白,我怎麼能選擇的子節點,如果它存在使用// w ^:P/W:R/W:RPR/W:亮點[@w:VAL =「黃色」]」 但不是如何可以選擇包含文本,如果在同一<w:r>塊中存在的高亮節點的實際節點W:t

例:我需要選擇內<W:t>文本如果<w:highlight>存在於父代中節點,併爲文檔中的所有情況執行此操作。

所以在這個例子中,我需要選擇文本「這一個去,因爲它突出顯示黃色」,因爲它有一個w:與w:val黃色相關的高亮節點。

<w:r w:rsidRPr="003815B4"> 
         <w:rPr> 
          <w:highlight w:val="yellow"/> 
         </w:rPr> 
         <w:t>This one goes because it is highlighted yellow</w:t> 
        </w:r> 

任何幫助或指針將不勝感激:-)

這裏的DOCX的XML例子(與可讀性刪除OOXML頭)

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<doc> 
<w:body> 
       <w:p w:rsidR="00B93038" w:rsidRDefault="003815B4"> 
        <w:r> 
         <w:t>This line stays because it is not highlighted in any colour</w:t> 
        </w:r> 
       </w:p> 
       <w:p w:rsidR="003815B4" w:rsidRDefault="003815B4"> 
        <w:r w:rsidRPr="003815B4"> 
         <w:rPr> 
          <w:highlight w:val="yellow"/> 
         </w:rPr> 
         <w:t>This one goes because it is highlighted yellow</w:t> 
        </w:r> 
       </w:p> 
       <w:tbl> 
        <w:tblPr> 
         <w:tblStyle w:val="TableGrid"/> 
         <w:tblW w:w="0" w:type="auto"/> 
         <w:tblLook w:val="04A0" w:firstRow="1" w:lastRow="0" w:firstColumn="1" w:lastColumn="0" w:noHBand="0" w:noVBand="1"/> 
        </w:tblPr> 
        <w:tblGrid> 
         <w:gridCol w:w="4621"/> 
         <w:gridCol w:w="4621"/> 
        </w:tblGrid> 
        <w:tr w:rsidR="003815B4" w:rsidTr="003815B4"> 
         <w:tc> 
          <w:tcPr> 
           <w:tcW w:w="4621" w:type="dxa"/> 
          </w:tcPr> 
          <w:p w:rsidR="003815B4" w:rsidRDefault="003815B4"> 
           <w:r> 
            <w:t>And so on</w:t> 
           </w:r> 
          </w:p> 
         </w:tc> 
         <w:tc> 
          <w:tcPr> 
           <w:tcW w:w="4621" w:type="dxa"/> 
          </w:tcPr> 
          <w:p w:rsidR="003815B4" w:rsidRDefault="003815B4"> 
           <w:r w:rsidRPr="003815B4"> 
            <w:rPr> 
             <w:highlight w:val="cyan"/> 
            </w:rPr> 
            <w:t>Blue highlight</w:t> 
           </w:r> 
          </w:p> 
         </w:tc> 
        </w:tr> 
        <w:tr w:rsidR="003815B4" w:rsidTr="003815B4"> 
         <w:tc> 
          <w:tcPr> 
           <w:tcW w:w="4621" w:type="dxa"/> 
          </w:tcPr> 
          <w:p w:rsidR="003815B4" w:rsidRDefault="003815B4"> 
           <w:r> 
            <w:t>Red</w:t> 
           </w:r> 
          </w:p> 
         </w:tc> 
         <w:tc> 
          <w:tcPr> 
           <w:tcW w:w="4621" w:type="dxa"/> 
          </w:tcPr> 
          <w:p w:rsidR="003815B4" w:rsidRDefault="003815B4"> 
           <w:r> 
            <w:t xml:space="preserve">Mixed </w:t> 
           </w:r> 
           <w:r w:rsidRPr="003815B4"> 
            <w:rPr> 
             <w:highlight w:val="red"/> 
            </w:rPr> 
            <w:t>text</w:t> 
           </w:r> 
           <w:r> 
            <w:t xml:space="preserve"> with </w:t> 
           </w:r> 
           <w:r w:rsidRPr="003815B4"> 
            <w:rPr> 
             <w:highlight w:val="green"/> 
            </w:rPr> 
            <w:t>some highlighted</w:t> 
           </w:r> 
           <w:r> 
            <w:t xml:space="preserve"> and some not</w:t> 
           </w:r> 
          </w:p> 
         </w:tc> 
        </w:tr> 
        <w:tr w:rsidR="003815B4" w:rsidTr="003815B4"> 
         <w:tc> 
          <w:tcPr> 
           <w:tcW w:w="4621" w:type="dxa"/> 
          </w:tcPr> 
          <w:p w:rsidR="003815B4" w:rsidRDefault="003815B4"/> 
         </w:tc> 
         <w:tc> 
          <w:tcPr> 
           <w:tcW w:w="4621" w:type="dxa"/> 
          </w:tcPr> 
          <w:p w:rsidR="003815B4" w:rsidRDefault="003815B4"/> 
         </w:tc> 
        </w:tr> 
       </w:tbl> 
       <w:p w:rsidR="003815B4" w:rsidRDefault="003815B4"/> 
       <w:p w:rsidR="003815B4" w:rsidRDefault="003815B4"> 
        <w:r> 
         <w:t>Another highlight</w:t> 
        </w:r> 
       </w:p> 
       <w:p w:rsidR="003815B4" w:rsidRDefault="003815B4"> 
        <w:r> 
         <w:t>Some text</w:t> 
        </w:r> 
       </w:p> 
       <w:p w:rsidR="003815B4" w:rsidRDefault="003815B4"/> 
       <w:p w:rsidR="003815B4" w:rsidRDefault="003815B4"> 
        <w:r> 
         <w:t>End</w:t> 
        </w:r> 
        <w:bookmarkStart w:id="0" w:name="_GoBack"/> 
        <w:bookmarkEnd w:id="0"/> 
       </w:p> 
       <w:sectPr w:rsidR="003815B4"> 
        <w:pgSz w:w="11906" w:h="16838"/> 
        <w:pgMar w:top="1440" w:right="1440" w:bottom="1440" w:left="1440" w:header="708" w:footer="708" w:gutter="0"/> 
        <w:cols w:space="708"/> 
        <w:docGrid w:linePitch="360"/> 
       </w:sectPr> 
      </w:body> 
</doc> 
+0

您使用XPath的環境是什麼? – 2014-12-02 19:16:10

+1

你試過//w:p/w:r/w:t[../w:rPr/w:highlight/@w:val='yellow'] – JasonPlutext 2014-12-02 20:24:01

+0

Mathias你好,它是Java和Sax Parser。 – user3012857 2014-12-03 01:00:40

回答

0

我想這應該工作。 初始化變量與命名空間:

w = 'http://schemas.openxmlformats.org/wordprocessingml/2006/main' 

既然你沒有提到你所使用的語言,我就指定以下XPath語法: 此代碼只是提取與一般強調的文字。

'.//w:p/w:r/w:highlight/../..//w:t', namespaces = {'w':w} 

要指定值說黃,用途:
'.//w:p/w:r/w:highlight[@w:val="yellow"]/../..//w:t', namespaces = {'w':w}
注意,「W」是區分大小寫的,不要使用大寫字母。

至於'../..//',如果您檢查xml,高亮屬性會出現在比w:r低一級的rPr標籤下。因此,../選擇父親(即w:rPr),然後選擇另一個../來選擇祖父母(即w:r),然後另一個/選擇w:r下的文本。

+0

你好,非常感謝你的意見。我實際上已經用Jason的建議解決了我的問題,但他沒有將他的評論置於一個問題中,所以我不能選擇它。 – user3012857 2014-12-04 13:11:05

+0

你的方法也可以工作,但我不能在我必須使用的這個軟件的非常嚴格的模式規則/規則集中聲明變量。它甚至不會接受帶有前綴的名稱空間,所以通過在openxml文檔中聲明w作爲新的根元素,我可以讓解析器在此Java軟件中工作。如果傑森沒有迴應我會很樂意接受你的回答 – user3012857 2014-12-04 13:14:58

+0

奧克,我的回答更爲pythonic。你可以考慮使用local-name()來代替。那不需要名稱空間參數然後.. – 2014-12-04 13:17:33