2012-10-08 87 views
1

我正在計劃將一些WordML文檔(2003)轉換爲DITA的XSLT轉換。相當簡單...除了我需要將png文件的內聯二進制文件(在標籤中)作爲文件保存在XML輸出文件之上的某個級別上。是否有可能在XSLT中輸出爲png,還是我必須先通過Java程序來處理它?WordML二進制文件轉換

+2

XSLT不能用於輸出任意二進制值 - 即使使用XML 1.1,值0x00仍然是非法的。您需要編寫並調用一個小型擴展函數,該函數將採用編碼字符串,進行解碼並將原始二進制文件寫入文件。 –

回答

1

你確定WordML內嵌二進制文件嗎?我認爲你的假設是不正確的。這可能是base64編碼的數據。我們已經做了,以前和我翻出產生的WordML從DITA代碼她,圖像被塞進「src」屬性的使用base64編碼的字節:

<image> 
<xsl:variable name="srcfile" select="concat('/word/',string($rels/rel:Relationships/rel:Relationship[@Id = $src]/@Target))"/> 
<xsl:variable name="imagepkg" select="//pkg:part[@pkg:name=$srcfile]"/> 
<xsl:variable name="attachmentContentType" select="$imagepkg/@pkg:contentType"/> 
<xsl:variable name="encodedImageBytes" select="$imagepkg/pkg:binaryData/text()"/>       
<xsl:variable name="scale"> 
    <xsl:choose> 
     <xsl:when test="w:r/w:drawing/wp:inline/a:graphic/a:graphicData/pic:pic/pic:spPr/a:ln/@w"> 
      <xsl:value-of select="number(w:r/w:drawing/wp:inline/a:graphic/a:graphicData/pic:pic/pic:spPr/a:ln/@w)"/> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:value-of select="$defscale"/> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:variable> 
<xsl:attribute name="width"> 
    <xsl:value-of select="concat(string(number(w:r/w:drawing/descendant::wp:extent/@cx div ($scale * 96))),'in')"/> 
</xsl:attribute> 
<xsl:attribute name="height"> 
    <xsl:value-of select="concat(string(number(w:r/w:drawing/descendant::wp:extent/@cy div ($scale * 96))),'in')"/> 
</xsl:attribute> 
<xsl:attribute name="src"> 
    <xsl:text>data:</xsl:text> 
    <xsl:value-of select="$attachmentContentType"/>     
    <xsl:text>;base64,</xsl:text> 
    <xsl:value-of select="$encodedImageBytes"/> 
</xsl:attribute> 
</image> 

你可以把編碼信息全部的base64如果需要,可以將其轉換爲單獨的文件,但二進制數據不在WordML中。如果您只需一步操作外部文件,就可以編寫Java擴展函數(假設您使用的是像Saxon這樣的Java XSLT)並傳入base64編碼圖像,該函數將解碼並寫入磁盤。