XmlDsigXPathTransform - 未定义名称空间前缀

时间:2017-10-26 07:53:05

标签: c# xpath signedxml

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

我需要在TransformChain中添加一个xpath过滤器,但在调用SignedXml.ComputeSignature时会抛出一个异常,即命名空间xbrli无效。

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

构建转换(根据Microsoft示例): public static XmlDsigXPathTransform CreateXPathTransform(string XPathString) { XmlDocument doc = new XmlDocument(); XmlElement xPathElem = doc.CreateElement("XPath"); xPathElem.InnerText = XPathString; XmlDsigXPathTransform xForm = new XmlDsigXPathTransform(); xForm.LoadInnerXml(xPathElem.SelectNodes(".")); return xForm; }

xpath和xml文件都有效。

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

2 个答案:

答案 0 :(得分:2)

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

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

*)请参阅示例#2

中的方法LoadTransformByXml

答案 1 :(得分:1)

这里的问题是,前缀仅在有限范围内本地有效。您的表达式包含的信息不足,无法将您的前缀解析为命名空间(即使它与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>