我有一个包含Base64数据的XML,使用XSLT文件删除它的最佳方法是什么?我正在使用Saxon重新格式化XML,并希望在格式化的XML中包含文件路径。我看了几个关于SO的例子,但似乎无法让它发挥作用。
我正在尝试提取Base64编码数据并将其写入外部文件,然后以编程方式将其写入XML I输出中的位置。我可能有多个同名的元素包含base64图像数据。根据我在网上找到的一些例子以及专家的帮助,我在下面有一些代码,但它会返回错误,这里是我得到的错误的屏幕截图。 http://i.imgur.com/5Np9bNp.png
<?xml version="1.0" encoding="utf-8"?>
<ProcessArea>
<DataArea>
<Process confirm="Always" acknowledge="Never"/>
<Image>
<Detail>
<TypeId>1</TypeId>
<Description>Description</Description>
<ImageId>525225</ImageId>
<New>true</New>
<PageCount>2</PageCount>
<ImageData><![CDATA[BASE64String==]]></ImageData>
</Detail>
</Image>
</DataArea>
</ProcessImage>
以下是我正在使用的XSLT文件。
<!-- Begin XST Style Sheet -->
<xsl:stylesheet
version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:saxon="http://saxon.sf.net/"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="saxon"
xmlns:fos="java.io.FileOutputStream">
<!-- Indent in the output -->
<xsl:output indent="yes"/>
<!-- Match the root -->
<xsl:template match="ProcessImage">
<Import> <!-- Insert our Import Node -->
<Archive ConnectionID="1" Name="1"> <!-- Define our Application Connection String -->
<Document pass="True"> <!-- Statically set documents to pass -->
<xsl:for-each select="Pages/Page"> <!-- Ignore -->
<DocFile FileLoc="{@FileName}" /> <!-- Ignore -->
</xsl:for-each>
<xsl:apply-templates select="DataArea/Image/Detail"/>
</Document>
</Archive>
</Import>
</xsl:template>
<xsl:template match="Detail">
<DocFile FileLoc="C:\SHARE FOLDER\SCANNED FILES\Scan{format-number(position() - 1, '0000')}.tif" /> <!-- Get the Filepath, give it a filename based on its position in the XML -->
<Fields>
<xsl:apply-templates select="parent::Image/Header/*[not(self::Count)]"/> <!-- Get Header Data, Ignore Count Node if Present, Apply Templates at bottom of XSL -->
<xsl:apply-templates select="*"/>
</Fields>
</xsl:template>
<xsl:template match="Header/* | Detail/*[not(self::ImageData)]"> <!-- Match Header OR Detail Child Elements -->
<Field Name="{name()}" value="{.}" pass="True"/>
</xsl:template>
<!-- Get Image File -->
<xsl:template match="Detail/ImageData">
<xsl:variable name="img" select="concat('file:///c:/test', format-number(count(parent::Detail/preceding-sibling::Detail), '0000'), '.jpg')"/>
<xsl:variable name="fos" select="fos:new(string($img))"/>
<xsl:value-of select="
fos:write($fos,
saxon:base64Binary-to-octets(xs:base64Binary(.)))"/>
<xsl:value-of select="fos:close($fos)"/>
</xsl:template>
</xsl:stylesheet>
答案 0 :(得分:0)
从您的问题中不清楚您想要制作什么输出。
有一些有用的Saxon扩展函数可用于处理base64数据:参见
http://www.saxonica.com/documentation/#!functions/saxon
和
http://www.saxonica.com/documentation/#!functions/saxon
例如,如果要编写二进制文件,首先使用xs:base64Binary构造函数将base64字符串转换为xs:base64Binary值,然后使用EXPath文件写入文件:writeBinary()函数。
你至少需要Saxon-PE。