1
我正在計劃將一些WordML文檔(2003)轉換爲DITA的XSLT轉換。相當簡單...除了我需要將png文件的內聯二進制文件(在標籤中)作爲文件保存在XML輸出文件之上的某個級別上。是否有可能在XSLT中輸出爲png,還是我必須先通過Java程序來處理它?WordML二進制文件轉換
我正在計劃將一些WordML文檔(2003)轉換爲DITA的XSLT轉換。相當簡單...除了我需要將png文件的內聯二進制文件(在標籤中)作爲文件保存在XML輸出文件之上的某個級別上。是否有可能在XSLT中輸出爲png,還是我必須先通過Java程序來處理它?WordML二進制文件轉換
你確定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編碼圖像,該函數將解碼並寫入磁盤。
XSLT不能用於輸出任意二進制值 - 即使使用XML 1.1,值0x00仍然是非法的。您需要編寫並調用一個小型擴展函數,該函數將採用編碼字符串,進行解碼並將原始二進制文件寫入文件。 –