从最外层元素中提取名称空间及其URI

时间:2014-07-12 17:15:28

标签: xml xpath xquery extract text-extraction

我试图在XML实例的最外层元素中提取两个属性的值。属性是:

xmlns:xbrli="http://www.xbrl.org/2003/instance"
xmlns:us-gaap="http://xbrl.us/us-gaap/2009-01-31"

到目前为止,使用XQuery还没有得到回报,因为:

  1. 在写下查询以完成工作之前,您必须声明命名空间,并且URI并不总是相同的
  2. 这样的命令:

    declare namespace xbrli="http://www.xbrl.org/2003/instance";
    doc("oba.xml")/xbrli:xbrl/string(@us-gaap)
    

    ......仍然没有结果。

  3. 我对任何尽可能严格的方法都持开放的态度,并且可以从任何实例文档的最外层元素中可靠地提取选择的命名空间。

    最外面的元素是:

    <xbrli:xbrl xmlns:xbrli="http://www.xbrl.org/2003/instance" xmlns:aem="http://www.agnico-eagle.com/20091231" xmlns:dei="http://xbrl.us/dei/2009-01-31" xmlns:dei-std="http://xbrl.us/dei-std/2009-01-31" xmlns:iso4217="http://www.xbrl.org/2003/iso4217" xmlns:link="http://www.xbrl.org/2003/linkbase" xmlns:ref="http://www.xbrl.org/2006/ref" xmlns:us-gaap="http://xbrl.us/us-gaap/2009-01-31" xmlns:us-gaap-all="http://xbrl.us/us-gaap-all/2009-01-31" xmlns:us-gaap-std="http://xbrl.us/us-gaap-std/2009-01-31" xmlns:us-roles="http://xbrl.us/us-roles/2009-01-31" xmlns:us-types="http://xbrl.us/us-types/2009-01-31" xmlns:xbrldi="http://xbrl.org/2006/xbrldi" xmlns:xbrldt="http://xbrl.org/2005/xbrldt" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    

1 个答案:

答案 0 :(得分:2)

这些是名称空间声明而不是属性!

或许类似于XQuery 1.0中的以下内容:

declare namespace xbrli="http://www.xbrl.org/2003/instance";

let $xbrl := fn:doc("oba.xml")/xbrli:xbrl
let $prefixes := fn:in-scope-prefixes($xbrl)
return
    for $prefix in $prefixes
    return
        fn:namespace-uri-for-prefix($prefix, $xbrl)

下面根据评论进行进一步的跟进“我需要的东西只能从最外层的元素中逐步搜索并为每个前缀提供一个URI。感谢您的大力帮助。”并且“我需要一些非常严格的东西,所以我不能在那里声明命名空间xbrli。就我而言,XBRL在任何地方都不稳定,所以在另一个实例上使用可能会改变的URI可能会产生很大的问题”:

let $outer-most := fn:doc("oba.xml")/element()
let $prefixes := fn:in-scope-prefixes($outer-most)
return
    for $prefix in $prefixes
    return
        fn:namespace-uri-for-prefix($prefix, $outer-most)