XSLT中通过摘要函数(MD5,128位)生成32位,128位数字

Generate 32 digit, 128 bit number by digest function (MD5, 128 bits) in XSLT

我有一个示例 XML,我需要使用 XSLT 生成一个参考密钥,它将是 128 位的 MD5 代码,使用节点中的数据。

示例输入 XML 是

<document>
<party>
    <gtin>1000909090</gtin>
    <pos>
        <attrGroupMany name="temperatureInformation">
            <row>
                <attr name="temperatureCode">STORADE</attr>
                <attrQual name="maximumTemperature" qual="FAH">80</attrQual>
                <attrQual name="minimumTemperature" qual="ABC">10</attrQual>
            </row>
            <row>
                <attr name="temperatureCode">HANDLING</attr>
                <attrQual name="maximumTemperature" qual="XYZ">20</attrQual>
                <attrQual name="minimumTemperature" qual="PQR">30</attrQual>
            </row>
        </attrGroupMany>
    </pos>
</party>
</document>

目前参考密钥(如下所示)是简单的数据连接,但现在它需要是 MD5 密钥。

<xsl:stylesheet 
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output indent="yes"/>

<xsl:template match="document"> 
    <CatalogItem>
        <RelationshipData>
            <Relationship>
                <RelationType>SUPPLIER_DATA</RelationType>  
                <RelatedItems>      
                    <xsl:for-each select="party/pos/attrGroupMany[@name ='temperatureInformation']/row/attrQual">                       
                        <RelatedItem>
                            <xsl:attribute name="referenceKey">
                                <xsl:value-of select="concat('SUPPLIER_DATA','-',../attr[@name='temperatureCode'],'-',@name,'-',@qual,'-',.    )"/>
                            </xsl:attribute>
                        </RelatedItem>
                    </xsl:for-each>

                </RelatedItems>
            </Relationship>
        </RelationshipData>
    </CatalogItem>

</xsl:template> 

</xsl:stylesheet>

预期输出是

<?xml version="1.0" encoding="UTF-8"?>
<CatalogItem>
<RelationshipData>
  <Relationship>
     <RelationType>SUPPLIER_DATA</RelationType>
     <RelatedItems>
        <RelatedItem referenceKey="8c0b1e2856825c8e799904f6f780e651" />
        <RelatedItem referenceKey="0700013c4df307fbe3a46ea06e2ad205" />
        <RelatedItem referenceKey="4e423d8b26dc91e5166df9a4f25490d5" />
        <RelatedItem referenceKey="9a9a1440c113df91314a2a26c31d39f3" />
     </RelatedItems>
  </Relationship>
</RelationshipData>
</CatalogItem>

我不知道如何在 XSL 中使用外部函数或深层函数。任何意见或想法或建议请分享..

这是使用Java

实现加密的快速方法

Input.xml

<?xml version="1.0" encoding="UTF-8" ?>
<document>
  <party>
    <gtin>1000909090</gtin>
    <pos>
      <attrGroupMany name="temperatureInformation">
        <row>
          <attr name="temperatureCode">STORADE</attr>
          <attrQual name="maximumTemperature" qual="FAH">80</attrQual>
          <attrQual name="minimumTemperature" qual="ABC">10</attrQual>
        </row>
        <row>
          <attr name="temperatureCode">HANDLING</attr>
          <attrQual name="maximumTemperature" qual="XYZ">20</attrQual>
          <attrQual name="minimumTemperature" qual="PQR">30</attrQual>
        </row>
      </attrGroupMany>
    </pos>
  </party>
</document>

test.xsl

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:encyptr="sample.MD5"
exclude-result-prefixes="encyptr" version="1.0">
<xsl:output indent="yes"/>
<xsl:template match="document"> 
    <CatalogItem>
        <RelationshipData>
            <Relationship>
                <RelationType>SUPPLIER_DATA</RelationType>  
                <RelatedItems>      
                    <xsl:for-each select="party/pos/attrGroupMany[@name ='temperatureInformation']/row/attrQual">                       
                        <RelatedItem>
                            <xsl:attribute name="referenceKey">
                                <xsl:value-of select="encyptr:getMD5(concat('SUPPLIER_DATA','-',../attr[@name='temperatureCode'],'-',@name,'-',@qual,'-',.))"/>
                            </xsl:attribute>
                        </RelatedItem>
                    </xsl:for-each>
                </RelatedItems>
            </Relationship>
        </RelationshipData>
    </CatalogItem>
</xsl:template> 
</xsl:stylesheet>

MD5.java

package sample;

import java.io.FileInputStream;
import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
 import java.io.File;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
public class MD5 {
    public static String getMD5(String input) {
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            byte[] messageDigest = md.digest(input.getBytes());
            BigInteger number = new BigInteger(1, messageDigest);
            String hashtext = number.toString(16);
            // Now we need to zero pad it if you actually want the full 32 chars.
            while (hashtext.length() < 32) {
                hashtext = "0" + hashtext;
            }
            return hashtext;
        }
        catch (NoSuchAlgorithmException e) {
            throw new RuntimeException(e);
        }
    }
     public static void main(String[] args) throws Exception{
         if (args.length != 3) {
             System.out.println("Usage: java XSLTransformer inputfile.xml inputfile.xsl outputfile");
             System.exit(1);
         }
         Transformer transformer =
             TransformerFactory.newInstance().newTransformer(new StreamSource(new File(args[1])));
         transformer.transform(new StreamSource(new File(args[0])),
                               new StreamResult(new File(args[2])));
         }
 }

运行 MD5.java代码通过传递三个参数Input.xmltest.xsloutput.xml

您将获得以下所需的 xml 加密值:

output.xml

<?xml version="1.0" encoding="UTF-8"?>
<CatalogItem>
<RelationshipData>
<Relationship>
<RelationType>SUPPLIER_DATA</RelationType>
<RelatedItems>
<RelatedItem referenceKey="8c0b1e2856825c8e799904f6f780e651"/>
<RelatedItem referenceKey="0700013c4df307fbe3a46ea06e2ad205"/>
<RelatedItem referenceKey="4e423d8b26dc91e5166df9a4f25490d5"/>
<RelatedItem referenceKey="9a9a1440c113df91314a2a26c31d39f3"/>
</RelatedItems>
</Relationship>
</RelationshipData>
</CatalogItem>