C# XmlDsigXPathTransform-未定义命名空间前缀

C# XmlDsigXPathTransform-未定义命名空间前缀,c#,xpath,signedxml,C#,Xpath,Signedxml,我正在尝试使用以下库创建一个签名的xml分离签名文件:[opensbr] 我需要向TransformChain添加xpath筛选器,但在调用SignedXml.ComputeSignature时,会引发一个异常,说明命名空间xbrli无效 xpath:/xbrli:xbrl/*[非(local-name()='DocumentAdoptionStatus'或local-name()='DocumentAdoptionDate'和namespace-uri()='http://www.nltaxo

我正在尝试使用以下库创建一个签名的xml分离签名文件:[opensbr]

我需要向TransformChain添加xpath筛选器,但在调用
SignedXml.ComputeSignature
时,会引发一个异常,说明命名空间
xbrli
无效

xpath:
/xbrli:xbrl/*[非(local-name()='DocumentAdoptionStatus'或local-name()='DocumentAdoptionDate'和namespace-uri()='http://www.nltaxonomie.nl/8.0/basis/venj/items/bw2-data)]

构造转换(根据Microsoft示例):

公共静态XmlDsigXPathTransform CreateXPathTransform(字符串XPathString)
{
XmlDocument doc=新的XmlDocument();
XmlElement xPathElem=doc.CreateElement(“XPath”);
xpathlem.InnerText=XPathString;
XmlDsigXPathTransform=新的XmlDsigXPathTransform();
LoadInnerXml(xPathElem.SelectNodes(“.”);
返回变换;
}

xpath和xml文件都是有效的

如何将命名空间前缀与
XmlDsigXPathTransform
一起使用?

*建议您可以在
XPath
元素上声明命名空间前缀:

.....
XmlElement xPathElem = doc.CreateElement("XPath");
xPathElem.SetAttribute("xmlns:xbrl", "xbrl namespace uri here");
xPathElem.InnerText = XPathString;
.....

*)请参见示例2中的方法
LoadTransformByXml
这里的问题是前缀仅在有限的范围内局部有效。表达式包含的信息不足,无法将前缀解析为命名空间(即使它与XBRL文档中的默认前缀相同)。 一种解决方案是按照har07的建议,在代码中“提供”名称空间映射

另一个解决方案是在节点级别将名称空间包含在完整的XPath片段中。这是荷兰审计专业在正式商业登记备案中使用的

<dsig-xpath:XPath xmlns:dsig-xpath="http://www.w3.org/2002/06/xmldsig-filter2" 
    xmlns:xbrli="http://www.xbrl.org/2003/instance" Filter="subtract">
    /xbrli:xbrl/*[localname()='DocumentAdoptionStatus' or local-name()='DocumentAdoptionDate' or local-name()='EmailAddressContact'] | //text()[normalize-space()='']
</dsig-xpath:XPath>

/xbrli:xbrl/*[localname()='DocumentAdoptionStatus'或local-name()='DocumentAdoptionDate'或local-name()='EmailAddressContact']|//text()[normalize-space()='']