我有一个示例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中使用外部函数或深层功能。任何输入或想法或建议请分享..
答案 0 :(得分:1)
以下是使用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>
&#13;
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>
&#13;
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])));
}
}
&#13;
通过传递三个参数MD5.java
Input.xml
和test.xsl
output.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>
&#13;