以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 XSL/XSLT/XSL-FO/CSS 』  (http://bbs.xml.org.cn/list.asp?boardid=8)
----  求助,请问此xslt如何写?  (http://bbs.xml.org.cn/dispbbs.asp?boardid=8&rootid=&id=61374)


--  作者:songyz
--  发布时间:4/15/2008 10:56:00 AM

--  求助,请问此xslt如何写?
[size=4]我打算实现一个内容抽取的数字签名,基于xml数字签名规范的,下面是我的签名片段,由于全部文件篇幅比较长,这里只列出比较关键的几个部分:
// <Reference> 元素
<Reference URI="#obj1">
  <Transforms>
    <Transform Algorithm="http://a.edu.cn/tranforms/ces#VerifyPolicy" />
  </Transforms>
  <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
  <DigestValue>XGesfrCnr8KuXCBmwlb4ofheksg=</DigestValue>
</Reference>
。。。

<Object Id="obj1">
  <Fragment URI="#bid" CEAS="1" />
    // 此处表示元素<Digest>或<Salt>只存在其中一个
    [<Digest>dsfasdfasdf</Digest>]|[<Salt>asdf645</Salt>]  
  </Fragment>
</Object>

这是数字签名的基本结构里的内容,现在我想实现如下的变换处理。
1、根据<Reference>的 URI属性找到<Object>元素的全部内容。
2、判断<Fragment>元素中是否存在<Digest>元素。
3、如果存在<Digest>元素,则判断属性CEAS属性是否为“1”,是的话就把CEAS属性值加到<Digest>元素值上,然后输出。
4、如果不存在<Digest>元素,也就是存在<Salt>元素,则根据<Fragment>元素的URI属性找到相应内容,加上<Salt>元素的值后,计算摘要值,然后再计算摘要值,摘要算符和3中的一样,最后同样把CEAS的值加到此摘要值上输出。

说明: 这里的输出就是一个字节流,用来生成<Reference>元素的子元素<DigestValue>的值。
不知道大家能不能明白我的意思,我想用一个xslt来实现一个变换处理,求大家帮忙看看,该如何实现。
[/size]


--  作者:songyz
--  发布时间:4/15/2008 12:50:00 PM

--  
怎么没有人回答呢,大家给想想办法
--  作者:songyz
--  发布时间:4/22/2008 9:58:00 AM

--  
ding
--  作者:songyz
--  发布时间:4/22/2008 10:14:00 AM

--  
或者在java中自定义一个transform来处理<Reference>所引用的内容。
--  作者:Qr
--  发布时间:4/22/2008 12:40:00 PM

--  
1、2、3点都很容易,第4点不明白,就是摘要值如何计算?另外,“输出就是一个字节流”,输出到哪里?“用一个xslt来实现一个变换处理”,是XML变换到XML吗,不明白,给个示例吧。晚饭后也许我可以给你一个答案……
--  作者:songyz
--  发布时间:4/22/2008 2:07:00 PM

--  
首先谢谢你的回答!
其实并不一定要写一个xslt的处理,可以用程序生成一个transform对象,用于对xml文件进行处理,计算摘要,是不是可以调用java类里面自定义的一个方法。不知道你对XML数字签名是否了解一些,我是用这个自定制的xslt来做抽取签名的,xslt的定义不能输出一个字节流吗?
--  作者:Qr
--  发布时间:4/22/2008 6:24:00 PM

--  
1、先取URI作为变量(你的URI中有特殊字符,下面的用法我不保证,因为我没去测试),如
<xsl:variable name="tmp" select="Reference/@URI"/>
然后通过
<xsl:apply-templates select="Object[@Id='substring($tmp,2)'>"/>
即可“找到<Object>元素的全部内容”,至于如何处理,你自己写代码。
2、3、<xsl:choose>
<xsl:when test="Digest"><!--存在Digest节点--><!--注意路径-->
<xsl:value-of select="(.,../@CASE)"/><!--这里将Digest和CASE连接,具体看需要吧-->
</xsl:when>
<xsl:otherwise><!--不存在Digest节点,即存在Salt节点--><!--因为至少存在一个Salt,所以直接用xsl:otherwise没问题-->
4、至于“根据<Fragment>元素的URI属性找到相应内容”可写在此处,你可参照1法处理。XSL中并没有“计算摘要值”的功能,一般使用外部程序或参阅XML与数字内容安全相关知识。
</xsl:otherwise>
</xsl:choose>

只能提供个思路给你了,根据需要去发挥吧。希望对你有帮助。


W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
46.875ms