在XSLT

时间:2016-07-04 07:39:18

标签: xml xslt hash xslt-1.0 md5

我有一个示例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中使用外部函数或深层功能。任何输入或想法或建议请分享..

1 个答案:

答案 0 :(得分:1)

以下是使用Java实现加密的快速方法

Input.xml中

&#13;
&#13;
<?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>
&#13;
&#13;
&#13;

test.xsl

&#13;
&#13;
<?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>
&#13;
&#13;
&#13;

MD5.java

&#13;
&#13;
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])));
         }
 }
&#13;
&#13;
&#13;

通过传递三个参数MD5.java Input.xmltest.xsl

运行output.xml代码

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

的Output.xml

&#13;
&#13;
<?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>
&#13;
&#13;
&#13;