我正计划将一些WordML文档(2003)的XSLT转换为DITA。相当简单...除了,我需要将png文件的内联二进制文件(在标记中)保存为XML输出文件上方的文件。是否可以在XSLT中输出到png,或者我是否必须首先通过Java程序处理它?</ p>
答案 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编码的图像,该函数将解码并写入磁盘。