如何使用XSLT在XML中散列字段

时间:2018-03-05 06:42:48

标签: xml xslt

我正在使用XSLT构建另一个XML。我希望某些字段具有哈希值而不是实际值。这意味着我应该知道数据何时发生变化,但由于某些安全原因,我不想知道数据。

<xsl:template name="sensitiveDataTemplate">
    <xsl:param name="sensitiveData"></xsl:param>
    <xsl:if test="$sensitiveData!=''">
        <xsl:value-of select="'XXXXXX'"></xsl:value-of>
    </xsl:if>
</xsl:template>

目前我只是用XXXXX替换数据,但我需要一些哈希值。

2 个答案:

答案 0 :(得分:1)

要生成哈希值,您可以注册自定义函数。

请参阅official documentation,了解如何在xlst处理器中注册自定义php函数。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" 
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     xmlns:php="http://php.net/xsl">
 <xsl:template name="sensitiveDataTemplate">
    <xsl:param name="sensitiveData"></xsl:param>
    <xsl:if test="$sensitiveData!=''">
        <xsl:value-of select="'php:some_hash_fun()'"></xsl:value-of>
    </xsl:if>
</xsl:template>
</xsl:stylesheet>

function some_hash_fun( )
{
    return "XXXX"; // hash value
}
$xmldoc = DOMDocument::loadXML($xml);
$xsldoc = DOMDocument::loadXML($xsl);

$proc = new XSLTProcessor();
$proc->registerPHPFunctions();  // can be either a string (a function name) or an array of functions.
$proc->importStyleSheet($xsldoc);
echo $proc->transformToXML($xmldoc);

希望它有所帮助。

答案 1 :(得分:0)

我能够在一段时间内找到解决方案,这与上面给出的答案类似。

我只是调用PHP函数来使用SHA1散列。 XSL:

<xsl:template name="sensitiveDataTemplate">
<xsl:param name="sensitiveData"></xsl:param>
<xsl:if test="$sensitiveData!=''">
    <xsl:value-of select="php:function('sha1', substring($sensitiveData,1, string-length($sensitiveData)))"></xsl:value-of>
</xsl:if>
</xsl:template>

PHP:

$proc->registerPHPFunctions('sha1');