如何使用 XSLT 解码嵌入 XML 中的二进制数据?

How to decode binary data embedded in XML using XSLT?

我有 XML 从遗留 Lotus Notes 应用程序中提取的数据。 XML 嵌入了二进制数据。根据 IBM Lotus Notes 网站上的信息,我猜测它是以 base64 格式编码的,但我不确定这一点。一些二进制数据似乎是图像,而其中一些似乎是嵌入的 MS Word 文档。我正在使用 Saxon XSLT 处理器。我如何使用 XSLT 解码此二进制数据?

数据大致如下:

<objectref version='2' name='EXT12682' class='Word.Document.8'
    displayformat='metafile' description='Microsoft Word Document' classid='{00020906-0000-0000-c000-000000000046}'
    storageformat='structstorage'><picture height='289px' width='625px' scaledheight='3.0104in'
        scaledwidth='6.5104in'><notesbitmap>illegiblegobbledygookillegiblegobbledygookillegiblegobbledygookillegiblegobbledygookillegiblegobbledygookillegiblegobbledygookillegiblegobbledygookillegiblegobbledygookillegiblegobbledygookillegiblegobbledygook</notesbitmap></picture></objectref>


<file hosttype='bytearraypage'
    compression='none' flags='storedindoc' name='STG12172'>
    <created><datetime dst='true'>20080924T171730,05-04</datetime></created>
    <modified><datetime dst='true'>20080924T171730,05-04</datetime></modified><filedata>illegiblegobbledygookillegiblegobbledygookillegiblegobbledygookillegiblegobbledygookillegiblegobbledygookillegiblegobbledygookillegiblegobbledygookillegiblegobbledygookillegiblegobbledygookillegiblegobbledygook</filedata></file>

Saxon(PE 和 EE)的最新版本包括 EXPath 二进制模块 (http://expath.org/spec/binary) 的实现,其中包含操作二进制数据所需的一切——当然除了您指定的二进制数据规范想操纵。如果您知道输入结构是什么,并且如果您知道要生成的输出应该是什么样子,那么二元函数应该对您有所帮助,但我担心您的问题并不真正了解。

如果您认为二进制数据是 base64 编码的 JPEG 文件,那么您实际上不需要 EXPath 二进制模块 - EXPath 文件模块(也在 Saxon PE 和 EE 中实现)应该足够。参见 http://expath.org/spec/file#fn.write-binary

你可以这样做:

file:write-binary("output.jpeg", xs:base64Binary(jpegBitMap))

将二进制元素的内容写入外部文件,然后您可以尝试使用理解相关格式的应用程序打开该文件。

(小心使用这些方法,因为它们有副作用,不太适合 XQuery 或 XSLT。例如,不要尝试在变量初始值设定项中调用它们,如果该变量从未使用过。)