XSLT:base64 데이터를 이미지 파일로 변환
-
18-09-2019 - |
문제
base64에서 이미지 파일을 인코딩하는 방법에 대한 몇 가지 질문을 보았지만 그 반대의 경우는 어떻습니까? XML 파일에 저장된 base64 문자열에서 그림을 어떻게 재구성합니까?
<resource>
<data encoding="base64">
R0lGODlhEAAQAPMAMcDAwP/crv/erbigfVdLOyslHQAAAAECAwECAwECAwECAwECAwECAwECAwEC
AwECAyH/C01TT0ZGSUNFOS4wGAAAAAxtc09QTVNPRkZJQ0U5LjAHgfNAGQAh/wtNU09GRklDRTku
MBUAAAAJcEhZcwAACxMAAAsTAQCanBgAIf8LTVNPRkZJQ0U5LjATAAAAB3RJTUUH1AkWBTYSQXe8
fQAh+QQBAAAAACwAAAAAEAAQAAADSQhgpv7OlDGYstCIMqsZAXYJJEdRQRWRrHk2I9t28CLfX63d
ZEXovJ7htwr6dIQB7/hgJGXMzFApOBYgl6n1il0Mv5xuhBEGJAAAOw==
</data>
<mime>image/gif</mime>
<resource-attributes>
<file-name>clip_image001.gif</file-name>
</resource-attributes>
</resource>
위의 XML 노드가 주어지면 resource
, 어떻게 만들 수 있나요? clip_image001.gif
?
제안해주세요:
- XSLT 프로세서 및/또는 확장을 통해 이를 가능하게 합니다.
- 변환을 트리거하는 샘플 XSLT
최소한 GIF 및 PNG 파일 형식을 처리할 수 있어야 합니다.어떤 OS에도 제한되지 않는 것이 좋습니다.
구현된 솔루션
주위에 기반 매즈 한센의 해결책.내가 언급 한 주요 차이점은 다음과 같습니다. net.sf.saxon.value.Base64BinaryValue
사용하지 않고 내 네임스페이스에서 직접 saxon
왜냐하면 저는 Saxonica 웹사이트의 설명보다 Java API를 더 직관적으로 이해했기 때문입니다. base64Binary-to-octets
그리고 base64Binary
기능.
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:b64="net.sf.saxon.value.Base64BinaryValue"
xmlns:fos="java.io.FileOutputStream"
...
exclude-result-prefixes="b64 fos">
...
<xsl:for-each select="resource">
<xsl:variable name="b64" select="b64:new(string(data))"/>
...
<xsl:variable name="fos" select="fos:new(string($img))"/>
<xsl:value-of select="fos:write($fos, b64:getBinaryValue($b64))"/>
<xsl:value-of select="fos:close($fos)"/>
</xsl:for-each>
...
추신보다 형제자매 질문 이미지 파일을 식별하는 데 필요한 해시를 얻는 방법을 구현했습니다.
이 질문은 다음의 하위 질문입니다. 이전에 물었던 또 다른 질문.
해결책
XSL 메일링 목록에서 이 항목을 찾았습니다. 사용 방법을 설명하는 것입니다. 색슨 확장 기능 xs:base64Binary-to-octet XSLT 2.0 스타일시트에서 Java FileOutputStream을 사용하여 파일로 스트리밍하려면 다음을 수행하세요.
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
version="2.0" xmlns:xs="http://www.w3.org/2001/XMLSchema";
xmlns:saxon="http://saxon.sf.net/";
xmlns:fos="java.io.FileOutputStream">
<xsl:template match="/">
<xsl:variable name="img" select="concat('c:\test\jesper', '.jpg')"/>
<xsl:variable name="fos" select="fos:new(string($img))"/>
<xsl:value-of select="fos:write($fos,
saxon:base64Binary-to-octets(xs:base64Binary(my-base64-encoded-image)))"/>
<xsl:value-of select="fos:close($fos)"/>
</xsl:template>
</xsl:stylesheet>
다른 팁
다음은 작동합니다:
<img>
<xsl:attribute name="src">
<xsl:value-of select="concat('data:image/gif;base64,',xPath)"/>
</xsl:attribute>
</img>
HTML로 변환합니다.
<img src="data:{mime};base64,{data}" />
Saxon 9.5 이후에는 EXPath 파일 확장 모듈(Saxon-PE 및 Saxon-EE에서 사용 가능)을 통해 더 나은 방법을 사용할 수 있습니다.
다음은 Word 문서에서 바이너리 이미지 파일을 추출하는 데 사용하는 코드의 일부입니다(소스 XML은 WordProcessingML 형식임).
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:file="http://expath.org/ns/file" xmlns:pkg="http://schemas.microsoft.com/office/2006/xmlPackage">
<xsl:template match="/pkg:package">
<xsl:apply-templates select="pkg:part/pkg:binaryData"/>
</xsl:template>
<xsl:template match="pkg:binaryData">
<xsl:variable name="filename">
<xsl:value-of select="replace(../@pkg:name, '/word/media/', '')"/>
</xsl:variable>
<xsl:variable name="path" select="concat('/some/folder/', $filename)"/>
<xsl:message><xsl:value-of select="$path"/></xsl:message>
<xsl:value-of select="file:write-binary($path, xs:base64Binary(string()))"/>
</xsl:template>