2012-07-06 28 views
1

我有幾段帶有「書名」樣式的段落,我想將這些段落轉換爲帶有書名「書名」的詞表。的XML如下:將OpenXML轉換爲帶有XLS的單詞

<w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"> 
<w:p> 
<w:pPr> 
<w:pStyle w:val="booktitle"/>… 
</w:pPr> 
<w:r> 
<w:rPr/> 
<w:t>First Paragraph</w:t> 
</w:r> 
</w:p> 
<w:p> 
<w:pPr> 
<w:pStyle w:val="booktitle"/>… 
</w:pPr> 
<w:r> 
<w:rPr/> 
<w:t>second Paragraph</w:t> 
</w:r> 
</w:p> 
</w:document> 

所需的輸出:

書名
第一款
第二款

我的XSL是在這裏:

<xsl:template match="w:p"> 
<xsl:choose> 
    <xsl:when test=".//w:pStyle[@w:val='booktitle']"> 
    <w:tbl> 
     <w:tblPr> 
     <w:tblBorders> 
      <w:top w:val="single" w:sz="1" /> 
      <w:left w:val="single" w:sz="1" /> 
      <w:bottom w:val="single" w:sz="1" /> 
      <w:right w:val="single" w:sz="1" /> 
      <w:insideH w:val="single" w:sz="1" /> 
      <w:insideV w:val="single" w:sz="1" /> 
     </w:tblBorders> 
     </w:tblPr> 
     <w:tblGrid> 
     <w:gridCol w:w="1024" /> 
     <w:gridCol w:w="1024" /> 
     </w:tblGrid> 
     <w:tr><w:tc><w:p><w:r><w:t>Booktitle</w:t></w:r></w:p></w:tc></w:tr> 
     <w:tr> 
     <w:tc> 
      <w:tcPr> 
      <w:tcW w:w="1024" /> 
      </w:tcPr> 
    <w:p><w:r><w:t><xsl:value-of select=".//w:r/w:t"/></w:t></w:r></w:p> 
     </w:tc> 
     </w:tr> 
     </w:tbl> 
    </xsl:when> 
</xsl:choose> 
</xsl:template> 

我收到輸出像

BOOKTITLE
第一款
BOOKTITLE
第二款

標題被重複用於每個節點。請幫我解決這個問題。在此先感謝...

回答

0

我想你應該從w:p模板中獲取表定義。您也可以通過使用過濾器來避免xsl:choose

這是主模板,定義表的開始和結束,並應用w:p模板:

<xsl:template match="/"> 
    <w:tbl> 
    <w:tblPr> 
     <w:tblBorders> 
     <w:top w:val="single" w:sz="1" /> 
     <w:left w:val="single" w:sz="1" /> 
     <w:bottom w:val="single" w:sz="1" /> 
     <w:right w:val="single" w:sz="1" /> 
     <w:insideH w:val="single" w:sz="1" /> 
     <w:insideV w:val="single" w:sz="1" /> 
     </w:tblBorders> 
    </w:tblPr> 
    <w:tblGrid> 
     <w:gridCol w:w="1024" /> 
     <w:gridCol w:w="1024" /> 
    </w:tblGrid> 
    <w:tr><w:tc><w:p><w:r><w:t>Booktitle</w:t></w:r></w:p></w:tc></w:tr> 
    <xsl:apply-templates select="//w:p[//w:pStyle/@w:val='booktitle']" /> 
    </w:tbl> 
</xsl:template> 

這是w:p模板,只需創建錶行:

<xsl:template match="w:p"> 
    <w:tr> 
    <w:tc> 
     <w:tcPr> 
     <w:tcW w:w="1024" /> 
     </w:tcPr> 
     <w:p><w:r><w:t><xsl:value-of select=".//w:r//w:t"/></w:t></w:r></w:p> 
    </w:tc> 
    </w:tr> 
</xsl:template> 
+0

您好感謝爲您的快速回復。我使用OpcXsltTransform.exe進行轉換,如果我使用上述xsl運行,我無法打開Word文件,它顯示無法打開文檔,但內容存在一些問題。 – VSr 2012-07-06 05:58:10

+0

我希望因爲在w:tr中定義的w:p節點沒有 VSr 2012-07-06 06:18:06

+0

我找到了通過檢查第一次發生來完成它的方法。我的樣式表如下:' BOOKTITLE VSr 2012-07-09 07:02:56