문제

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?

제안해주세요:

  1. XSLT 프로세서 및/또는 확장을 통해 이를 가능하게 합니다.
  2. 변환을 트리거하는 샘플 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>
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top