1

いくつかの WordML ドキュメント (2003) から DITA への XSLT 変換を計画しています。かなり簡単です... ただし、png ファイル (タグ内) のインライン バイナリを、XML 出力ファイルより上のレベルのファイルとして保存する必要があります。XSLT で png に出力することは可能ですか、それとも最初に Java プログラムで処理する必要がありますか?

4

1 に答える 1

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 でエンコードされたイメージを渡すと、関数はデコードしてディスクに書き込みます。

于 2013-06-18T23:16:09.743 に答える