WordML二进制文件转换

时间:2012-10-08 09:18:58

标签: xml xslt ms-word dita

我正计划将一些WordML文档(2003)的XSLT转换为DITA。相当简单...除了,我需要将png文件的内联二进制文件(在标记中)保存为XML输出文件上方的文件。是否可以在XSLT中输出到png,或者我是否必须首先通过Java程序处理它?<​​/ p>

1 个答案:

答案 0 :(得分:1)

你确定WordML有内联二进制文件吗?我认为你的假设不正确。它可能是base64编码数据。我们之前已经完成了这项工作,并且挖出了从WordML生成DITA的代码,使用base64编码的字节将图像填充到“src”属性中:

<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编码的图像,该函数将解码并写入磁盘。