Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用XAdES4j生成带有xpath转换的分离签名时出错_Xpath_Digital Signature_Xades4j_Xml Dsig - Fatal编程技术网

使用XAdES4j生成带有xpath转换的分离签名时出错

使用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

我正在使用xades4j生成xades签名。 我想在引用中包含xpath转换。我的问题是它是一个分离的签名,xpath有名称空间

我尝试使用以下xml(摘录):

它工作正常,参考如下所示:

<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());