使用XAdES4j生成带有xpath转换的分离签名时出错
我正在使用xades4j生成xades签名。 我想在引用中包含xpath转换。我的问题是它是一个分离的签名,xpath有名称空间 我尝试使用以下xml(摘录): 它工作正常,参考如下所示:使用XAdES4j生成带有xpath转换的分离签名时出错,xpath,digital-signature,xades4j,xml-dsig,Xpath,Digital Signature,Xades4j,Xml Dsig,我正在使用xades4j生成xades签名。 我想在引用中包含xpath转换。我的问题是它是一个分离的签名,xpath有名称空间 我尝试使用以下xml(摘录): 它工作正常,参考如下所示: <ds:Reference Id="xmldsig-44c42d30-9a42-4290-afba-b89dc807a668-ref0" URI=""> <ds:Transforms> <ds:Transfo
<ds:Reference Id="xmldsig-44c42d30-9a42-4290-afba-b89dc807a668-ref0" URI="">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
<ds:Transform Algorithm="http://www.w3.org/2002/06/xmldsig-filter2">
<dsig-xpath:XPath xmlns:dsig-xpath="http://www.w3.org/2002/06/xmldsig-filter2" Filter="intersect">/collection/album/t:tracks/t:song[ @tracknumber = 1 ]</dsig-xpath:XPath>
</ds:Transform>
</ds:Transforms>
我得到错误:前缀必须解析为命名空间:t
我的问题与此处描述的问题类似:
但是没有答案,我得到的有点不同。我希望这个问题的答案能帮助我
那么,如何在xades4j中将名称空间设置为转换呢?很好!目前没有办法指定这个。但是,我认为底层的ApacheSantuarioAPI使用该方法支持这一点。看起来输出
XPath
元素将包含名称空间声明。如果可能的话,我将对此进行测试并添加支持。是的,我环顾四周,看看可以在哪里设置setXPathNamespaceContext。我看到了一个xpath元素具有名称空间的示例:添加了对xpath查询中名称空间的支持。
String xpathString = "/collection/album/t:tracks/t:song[ @tracknumber = 1 ]";
DataObjectDesc obj1 = new DataObjectReference("");
obj1.withTransform(new EnvelopedSignatureTransform());
obj1.withTransform(XPath2Filter.intersect( xpathString ));
SignedDataObjects objs = new SignedDataObjects( obj1 );
Document doc = getDocument(path+fileName);
signer.sign( objs, doc.getDocumentElement() );
<ds:Reference Id="xmldsig-44c42d30-9a42-4290-afba-b89dc807a668-ref0" URI="">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
<ds:Transform Algorithm="http://www.w3.org/2002/06/xmldsig-filter2">
<dsig-xpath:XPath xmlns:dsig-xpath="http://www.w3.org/2002/06/xmldsig-filter2" Filter="intersect">/collection/album/t:tracks/t:song[ @tracknumber = 1 ]</dsig-xpath:XPath>
</ds:Transform>
</ds:Transforms>
String xpathString = "/collection/album/t:tracks/t:song[ @tracknumber = 1 ]";
DataObjectDesc obj1 = new DataObjectReference( fileName );
obj1.withTransform(XPath2Filter.intersect( xpathString ));
SignedDataObjects objs = new SignedDataObjects( obj1 );
objs.withBaseUri( "file:///"+path );
signer.sign( objs, db.newDocument());