1

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

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

路径:/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

4

2 回答 2

2

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

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

*) 参见LoadTransformByXml示例#2中的方法

于 2017-10-26T11:10:20.220 回答
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>
于 2018-11-17T07:32:44.880 回答