2009-11-06 101 views
3

我需要找到一种方法,找到一种方法,找到了在该XML节点编码数据以base64哈希//注意/资源/数据,或以某种方式相匹配,否则它在节点中的散列值//注意/内容/ EN-注// EN-媒体@散XSLT:获取或匹配的base64编码的哈希值数据

请参见下面的完整的XML文件

请建议的方式来获得{ |匹配} 使用XSLT

4aaafc3e14314027bb1d89cf7d59a06c 

从{|}与

R0lGODlhEAAQAPMAMcDAwP/crv/erbigfVdLOyslHQAAAAECAwECAwECAwECAwECAwECAwECAwEC 
AwECAyH/C01TT0ZGSUNFOS4wGAAAAAxtc09QTVNPRkZJQ0U5LjAHgfNAGQAh/wtNU09GRklDRTku 
MBUAAAAJcEhZcwAACxMAAAsTAQCanBgAIf8LTVNPRkZJQ0U5LjATAAAAB3RJTUUH1AkWBTYSQXe8 
fQAh+QQBAAAAACwAAAAAEAAQAAADSQhgpv7OlDGYstCIMqsZAXYJJEdRQRWRrHk2I9t28CLfX63d 
ZEXovJ7htwr6dIQB7/hgJGXMzFApOBYgl6n1il0Mv5xuhBEGJAAAOw== 

此示例XML文件显然已经被修整为简洁/简单。每张纸币实际可能包含> 1图像,因此需要获得/匹配散列。

XML文件:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE en-export SYSTEM "http://xml.evernote.com/pub/evernote-export.dtd"> 
<en-export export-date="20091029T063411Z" application="Evernote/Windows" version="3.0"> 

<note> 
    <title>A title here</title> 
    <content><![CDATA[ 
     <?xml version="1.0" encoding="UTF-8"?> 
     <!DOCTYPE en-note SYSTEM "http://xml.evernote.com/pub/enml.dtd"> 
     <en-note bgcolor="#FFFFFF"> 
      <p>Some text here (followed by the picture) 
      <p><en-media hash="4aaafc3e14314027bb1d89cf7d59a06c" type="image/gif" border="0" width="16" height="16" alt="A picture"/></p> 
      <p>Some more text here (preceded by the picture) 
     </en-note> 
    ]]></content> 
    <created>20090925T063154Z</created> 
    <note-attributes> 
     <author/> 
    </note-attributes> 
    <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> 
</note> 

</en-export> 

实施的解决方案

使用Jackem建议的解决方案的概念。主要区别是我避免创建自己的Java类(并创建额外的依赖关系)。我做处理XSLT中,因为它是直截了当不够,仅参考附带的基本Java库外部依赖。
Jackem的解决方案是更正确因为它不输于一些哈希前导零,但是我发现,它借此在其他地方使用li'l基本两轮牛车的照顾容易得多。

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    ... 
    xmlns:md5="java.security.MessageDigest" 
    xmlns:bigint="java.math.BigInteger" 
    exclude-result-prefixes="md5 bigint"> 
... 
<xsl:for-each select="resource"> 
    <xsl:variable name="md5inst" select="md5:getInstance('MD5')" /> 
    <xsl:value-of select="md5:update($md5inst, $b64bin)" /> 
    <xsl:variable name="imgmd5bytes" select="md5:digest($md5inst)" /> 
    <xsl:variable name="imgmd5bigint" select="bigint:new(1, $imgmd5bytes)" /> 
    <xsl:variable name="imgmd5str" select="bigint:toString($imgmd5bigint, 16)" /> 
    <!-- NOTE: $imgmd5str loses the leading zero from imgmd5bytes (if there is one) --> 
</xsl:for-each> 
... 

P.S.看到sibling question我实施base64-->image file转换


这个问题是一个 another question I have asked previously subquestion。

回答

3

有关在XSLT中执行base64解码的相关问题,您有accepted an answer,它使用了Saxon和Java扩展。所以我认为你可以使用这些。

在这种情况下,你可以计算MD5和Java创建一个扩展:从你的XSLT

package com.stackoverflow.q1684963; 

import java.math.BigInteger; 
import java.security.MessageDigest; 
import java.security.NoSuchAlgorithmException; 

public class MD5Sum { 
    public static String calc(byte[] data) throws NoSuchAlgorithmException { 
     MessageDigest md5 = MessageDigest.getInstance("MD5"); 
     byte[] digest = md5.digest(data); 
     BigInteger digestValue = new BigInteger(1, digest); 
     return String.format("%032x", digestValue); 
    } 
} 

您与撒克逊运行2.0样式表,然后你可以只呼叫该分机。假设你已经拥有了基于64位解码的数据(例如,从扩展功能saxon:base64Binary-to-octets作为链接的答案)可变data

<xsl:value-of xmlns:md5sum="com.stackoverflow.q1684963.MD5Sum" 
       select="md5sum:calc($data)"/> 
+0

谢谢!我设法使用这个相同的概念来实现它,除了我自己不创建类,而只是从XSLT中调用这些方法。我会发布我的impl。很快就会解决... – bguiz 2009-11-07 23:39:33

+3

Credit to credit due:Java代码是根据不同的答案改编的问题http://stackoverflow.com/questions/332079/in-java-how-do-i-convert-a-byte-阵列到一个串 - 的 - 己数字-而维持乐 – 2009-11-08 16:04:07

1
  • 下载像this one或使用一些源代码从web此
  • 输出文件中的一些免费软件的Base64解码器是some_file.gif,268个字节,文件夹图标
  • 使用生成该文件的MD5校验md5sum或再次从网络

输出一些源代码给我:

4aaafc3e14314027bb1d89cf7d59a06c 

这就是你想要的,不是吗? 这将是棘手的(如果不是不可能的,如果你问我,绝对不值得的努力),做这一切在XSLT,但至少你现在已经得到了这个哈希是对GIF文件使用MD5创建的信息。

+0

我确实承认,使用XSLT会更容易,但我也想用XSLT来做其他事情,而不是使用这个问题。我已经能够找到如何在XSLT中解码base64,但是现在需要找到一种方法来获得md5sum,当然使用XSLT。 – bguiz 2009-11-07 10:57:36

+0

我发现的唯一一条消息是2004年的exslt邮件列表中的一条消息,其中有人试图开发一个可以生成MD5和其他校验和的加密命名空间,但看起来这是一个死胡同 - 请看这里:http:// osdir.com/ml/text.xml.xslt.extensions/2004-05/msg00002.html – schnaader 2009-11-07 16:13:49

1

4aaaf...是你得到的二进制数据的MD5当你解码base64编码数据。我认为你没有别的选择,只能解码<data>元素的内容并通过MD5实现来运行它,这明显超出了XSL转换的范围。据推测,XSLT的结果将被一些其他代码处理,这些代码可以提取和验证图像。

0

这个怎么样(添加commons-codec到类路径):

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:digest="org.apache.commons.codec.digest.DigestUtils"> 
    [...] 
    <xsl:value-of select="digest:md5Hex('hello, world!')"/> 
</xsl:stylesheet>