C# XmlDsigXPathTransform-未定义命名空间前缀
我正在尝试使用以下库创建一个签名的xml分离签名文件:[opensbr] 我需要向TransformChain添加xpath筛选器,但在调用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
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()='']