我有document.I正在使用签名的XMLSignature中的文档的一部分的XML。 寻找消化之前, 我想申请XSLT转换。
根据我读,XSLT转换XML文档为另一种格式(可以是XML也)。 现在我很困惑的是,
其中,将被转换的新文件是即时拍摄?
如何从这个新创建的文档检索值,如果我想将它展示给用户?
我的XML文档
<r1>
<user>asd</user>
<person>ghi</person>
</r1>
代码转换
Transform t=fac.newTransform(Transform.XPATH,new XPathFilterParameterSpec("/r1/user"));
据XPath的改造,每当用户元素的值发生变化不应该被验证了的XMLSignature。 如果人的要素的价值变动则签名应该进行验证。 但是,当我改变人的要素的价值签名不验证。 为什么?
签署文件时,变换所使用的XSLT涉及到如何计算签名时选择在源XML节点。
这个问题/答案由戴夫使用xpath2涉及到XML文档的签名部分。 在肖恩Mullans'后链接在这个答案表明xpath2是比较合适的,因为XPath表达式的评估每个节点完成签署一份文件的部分。
因此,基于该太阳DSIG例如 ,你可以使用替换基准制作:
List<XPathType> xpaths = new ArrayList<XPathType>();
xpaths.add(new XPathType("//r1/user", XPathType.Filter.INTERSECT));
Reference ref = fac.newReference
("", fac.newDigestMethod(DigestMethod.SHA1, null),
Collections.singletonList
(fac.newTransform(Transform.XPATH2,
new XPathFilter2ParameterSpec(xpaths))),
null, null);
这让// R1 /用户用签名来保护,而文档的其余部分可以改变。
与的xpath / xpath2选择的问题是,可以为/一些/节点/该/并/不/存在被生成的签名。 你是对的修改测试文件,并确保该签名是工作,你期望的方式。
你可能会通过生成一个签名,然后与验证之前的XML节点篡改测试在测试程序中的文件:
NodeList nlt = doc.getElementsByTagName("user");
nlt.item(0).getFirstChild().setTextContent("Something else");
到一个XPath选择一个更可靠的替代方法可能是把一个ID在你希望签下像XML文档元素:
<r1>
<user id="sign1">asd</user>
<person>ghi</person>
</r1>
然后在包膜转移的第一个参数引用该ID作为URI:
Reference ref = fac.newReference
("#sign1", fac.newDigestMethod(DigestMethod.SHA1, null),
Collections.singletonList
(fac.newTransform(Transform.ENVELOPED,(TransformParameterSpec) null)),
null, null);
对于输出,一个签名操作添加到DOM已加载到内存中一个新的签名元素。 您可以通过将像这样流的输出:
TransformerFactory tf = TransformerFactory.newInstance();
Transformer trans = tf.newTransformer();
trans.setOutputProperty(OutputKeys.INDENT, "yes");
trans.transform(new DOMSource(doc), new StreamResult(System.out));
XSLT规范并没有定义会发生什么结果文档; 多数民众赞成由你选择的XSLT处理器的API规范定义。 例如,如果你使用JAXP接口从Java调用XSLT,你可以要求该结果作为内存中的DOM树或它会存储到磁盘上的指定文件。
您已为问题的“Java”这是你给你的处理环境的唯一线索。 我的猜测是要转换到一个DOM,然后利用DOM接口来得到新的文档的价值。 但如果你正在使用XSLT 2.0和萨克森的s9api界面比原生JAXP接口更有用。
在XSLT部分定义只变换定义,没有别的。 看看这个:
Java的XSLT教程
在弗朗索瓦砾石回答的input.xml文件是会转化的文件时,transform.xslt是描述如何将XML文件的XSLT定义。 output.out是结果,这可能是XML,但它也可以是HTML,平面文件...
这是我从我使用XSLT时:
http://www.w3schools.com/xsl/default.asp
看一看这也:
http://www.w3schools.com/xsl/tryxslt.asp?xmlfile=cdcatalog&xsltfile=cdcatalog