【问题标题】:XmlDsigXPathTransform - namespace prefix is not definedXmlDsigXPathTransform - 未定义命名空间前缀
【发布时间】:2017-10-26 07:53:04
【问题描述】:

我正在尝试使用此库创建已签名的 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 中使用命名空间前缀?

【问题讨论】:

    标签: c# xpath signedxml


    【解决方案1】:

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

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

    *) 请参阅 示例 #2

    中的方法 LoadTransformByXml

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2016-07-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-16
        • 1970-01-01
        • 2011-06-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多