从 base64 内容写入二进制文件
Write binary file from base64 content
我有 base64 编码的内容(图像文件),我想使用 XSLT/XPath 2.0.
将其写入外部文件
这是我的输入文件
<root>
<img>iVBORw0KGgoAAAANSUhEUgAABAAAAAMAAQMAAACAdIdOAAAABlBMVEUAAAD///
+l2Z/dAAABpElEQVR42u3OQQ0AMAgEsHOAf7Wbhn0GIa2C5jSLgICAgICAgICAgI
CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI
CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDgQB6UgICAgICAgICAgICAgI
CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI
CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI
CAgICAgICAgICAgICAgICAgICAgICAgMDKwB8CAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAu2BC6XQXOr9fnZDAAAAAElFTkSuQmCC</img>
</root>
这是我写文件的尝试:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:file="http://expath.org/ns/file">
<xsl:template match="img">
<myimg>
<xsl:variable name="filename" select="'hello.png'"/>
<xsl:attribute name="filename" select="$filename"/>
<xsl:value-of select="file:write-binary($filename,xs:base64Binary(.))" />
</myimg>
</xsl:template>
</xsl:stylesheet>
但是 "nothing happens",这意味着我得到一个 XML 文件,其中 myimg 作为根标记(预期),但没有文件写入当前目录。我该怎么办?
我使用 Saxon-PE-9.7.0.15 和 oXygen XML
编辑:使用 hello.png
作为文件名(以减少混淆)
这似乎是一个与在 oXygen 中使用 Saxon 和 EXPath 文件模块相关的问题,因为当我 运行 在 oXygen 外部使用 Saxon 的 XSLT 文件是在与 XML 输入相同的目录中创建的和样式表代码,但是在 oXygen 内部使用 <xsl:message select="'current-dir() ', file:current-dir()"/>
表示文件模块使用不同的目录来读取和写入。
我有 base64 编码的内容(图像文件),我想使用 XSLT/XPath 2.0.
将其写入外部文件这是我的输入文件
<root>
<img>iVBORw0KGgoAAAANSUhEUgAABAAAAAMAAQMAAACAdIdOAAAABlBMVEUAAAD///
+l2Z/dAAABpElEQVR42u3OQQ0AMAgEsHOAf7Wbhn0GIa2C5jSLgICAgICAgICAgI
CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI
CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDgQB6UgICAgICAgICAgICAgI
CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI
CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI
CAgICAgICAgICAgICAgICAgICAgICAgMDKwB8CAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAu2BC6XQXOr9fnZDAAAAAElFTkSuQmCC</img>
</root>
这是我写文件的尝试:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:file="http://expath.org/ns/file">
<xsl:template match="img">
<myimg>
<xsl:variable name="filename" select="'hello.png'"/>
<xsl:attribute name="filename" select="$filename"/>
<xsl:value-of select="file:write-binary($filename,xs:base64Binary(.))" />
</myimg>
</xsl:template>
</xsl:stylesheet>
但是 "nothing happens",这意味着我得到一个 XML 文件,其中 myimg 作为根标记(预期),但没有文件写入当前目录。我该怎么办?
我使用 Saxon-PE-9.7.0.15 和 oXygen XML
编辑:使用 hello.png
作为文件名(以减少混淆)
这似乎是一个与在 oXygen 中使用 Saxon 和 EXPath 文件模块相关的问题,因为当我 运行 在 oXygen 外部使用 Saxon 的 XSLT 文件是在与 XML 输入相同的目录中创建的和样式表代码,但是在 oXygen 内部使用 <xsl:message select="'current-dir() ', file:current-dir()"/>
表示文件模块使用不同的目录来读取和写入。