我正在尝试使用此库创建一个签名的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
一起使用?
答案 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>