Запрос идентификаторов сущности, присутствующих в экземпляре XBRL, с помощью MarkLogic XQuery
Я использую консоль Xquery от MarkLogic, чтобы поиграться с ней и запросить документы XBRL
Вот так выглядит мой документ XBRL
<xbrli:xbrl xml:lang="nl" xmlns:link="http://www.xbrl.org/2003/linkbase" xmlns:bd-alg="http://www.nltaxonomie.nl/nt11/bd/20161207/dictionary/bd-algemeen" xmlns:bd-bedr="http://www.nltaxonomie.nl/nt11/bd/20161207/dictionary/bd-bedrijven" xmlns:bd-bedr-tuple="http://www.nltaxonomie.nl/nt11/bd/20161207/dictionary/bd-bedr-tuples" xmlns:bd-dim-mem="http://www.nltaxonomie.nl/nt11/bd/20161207/dictionary/bd-domain-members" xmlns:bd-dim-dim="http://www.nltaxonomie.nl/nt11/bd/20161207/validation/bd-axes" xmlns:xbrldi="http://xbrl.org/2006/xbrldi" xmlns:xbrli="http://www.xbrl.org/2003/instance" xmlns:iso4217="http://www.xbrl.org/2003/iso4217" xmlns:xlink="http://www.w3.org/1999/xlink">
<link:schemaRef xlink:type="simple" xlink:href="http://www.nltaxonomie.nl/nt11/bd/20161207/entrypoints/bd-rpt-vpb-aangifte-2016.xsd"/>
<xbrli:context id="ContextDurationDeclarant">
<xbrli:entity>
<xbrli:identifier scheme="www.belastingdienst.nl/identificatie">800004449</xbrli:identifier>
</xbrli:entity>
<xbrli:period>
<xbrli:startDate>2016-01-01</xbrli:startDate>
<xbrli:endDate>2016-12-31</xbrli:endDate>
</xbrli:period>
<xbrli:scenario>
<xbrldi:explicitMember dimension="bd-dim-dim:PartyDimension">bd-dim-mem:Declarant</xbrldi:explicitMember>
</xbrli:scenario>
</xbrli:context>
</xbrli:xbrl>
Как видите, это XML.
Запрос, который я хочу сделать,
xquery version "1.0-ml";
declare namespace lang="nl";
declare namespace link="http://www.xbrl.org/2003/linkbase";
declare namespace bd-alg="http://www.nltaxonomie.nl/nt11/bd/20161207/dictionary/bd-algemeen";
declare namespace bd-bedr="http://www.nltaxonomie.nl/nt11/bd/20161207/dictionary/bd-bedrijven";
declare namespace bd-bedr-tuple="http://www.nltaxonomie.nl/nt11/bd/20161207/dictionary/bd-bedr-tuples";
declare namespace bd-dim-mem="http://www.nltaxonomie.nl/nt11/bd/20161207/dictionary/bd-domain-members";
declare namespace bd-dim-dim="http://www.nltaxonomie.nl/nt11/bd/20161207/validation/bd-axes";
declare namespace xbrldi="http://xbrl.org/2006/xbrldi";
declare namespace xbrli="http://www.xbrl.org/2003/instance";
declare namespace iso4217="http://www.xbrl.org/2003/iso4217";
declare namespace xlink="http://www.w3.org/1999/xlink";
declare namespace type="simple";
declare namespace href="http://www.nltaxonomie.nl/nt11/bd/20161207/entrypoints/bd-rpt-vpb-aangifte-2016.xsd";
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Database dump</title>
</head>
<body>
<b>XML Content</b>
{
for $xbrli:context in doc("test.xml")/xbrli:xbrl
return
<pre>
Identifier: { $xbrli:context/xbrli:entity/xbrli:identifier }
</pre>
}
</body>
</html>
Я не вижу проблемы, но Xquery, очевидно, делает, потому что я получаю только пустые последовательности. Пожалуйста, помогите мне!
3 ответа
И Мартин, и Лорен имеют точку зрения, и у меня также есть еще несколько комментариев, касающихся XBRL.
Вы должны оба добавить xbrli:context
в XPath предложения for и добавить /string()
к идентификатору, чтобы получить только строковое значение (в противном случае он вложит элемент).
{
for $xbrli:context in doc("test.xml")/xbrli:xbrl/xbrli:context
return
<pre>
Identifier: { $xbrli:context/xbrli:entity/xbrli:identifier/string() }
</pre>
}
xbrli:context
элемент должен находиться за пределами предложения возврата, поскольку в общем случае в одном экземпляре XBRL имеется несколько контекстов, но только один объект на контекст, если экземпляр соответствует XBRL.
Кроме того, вы можете захотеть выполнить дублирование, поскольку разные контексты могут содержать одну и ту же сущность. На самом деле, исходя из опыта, экземпляр XBRL очень и очень часто содержит только одну сущность во всех контекстах. Это относится к заявкам SEC и многим другим регулирующим органам (хотя, конечно, XBRL не накладывает никаких ограничений, так что другие наборы данных XBRL могут иметь несколько объектов на экземпляр).
затем /string()
становится лишним.
{
for $entity in distinct-values(
doc("test.xml")/xbrli:xbrl/xbrli:context/xbrli:entity/xbrli:identifier
)
return <pre>Identifier: { $entity }</pre>
}
На самом деле, как xbrli:identifier
появится только в этих местах в соответствующем экземпляре XBRL, вы также можете использовать функцию "потомок или сам" непосредственно в этом QName:
{
for $entity in distinct-values(
doc("test.xml")//xbrli:identifier
)
return <pre>Identifier: { $entity }</pre>
}
Наконец, во многих заявках факт XBRL даже сообщит более дружелюбное имя для сущности (в заявках SEC это dei:EntityRegistrantName
), в то время как идентификатор объекта даст вам CIK (также сообщается как dei:EntityCentralIndexKey
).
Вы назвали свою переменную $xbrli:context
пока вы только выбираете doc("test.xml")/xbrli:xbrl
вместо doc("test.xml")/xbrli:xbrl/xbrli:context
Вы, кажется, хотите.
Измените это на:
for $xbrl in doc("test.xml")//xbrli:xbrl
return
<pre>
Identifier: { $xbrl/xbrli:context/xbrli:entity/xbrli:identifier/string() }
</pre>
Вам нужен /string() в конце, чтобы получить содержимое
Я реализовал это следующим образом:
xquery version "1.0-ml";
declare namespace lang="nl";
declare namespace link="http://www.xbrl.org/2003/linkbase";
declare namespace bd-alg="http://www.nltaxonomie.nl/nt11/bd/20161207/dictionary/bd-algemeen";
declare namespace bd-bedr="http://www.nltaxonomie.nl/nt11/bd/20161207/dictionary/bd-bedrijven";
declare namespace bd-bedr-tuple="http://www.nltaxonomie.nl/nt11/bd/20161207/dictionary/bd-bedr-tuples";
declare namespace bd-dim-mem="http://www.nltaxonomie.nl/nt11/bd/20161207/dictionary/bd-domain-members";
declare namespace bd-dim-dim="http://www.nltaxonomie.nl/nt11/bd/20161207/validation/bd-axes";
declare namespace xbrldi="http://xbrl.org/2006/xbrldi";
declare namespace xbrli="http://www.xbrl.org/2003/instance";
declare namespace iso4217="http://www.xbrl.org/2003/iso4217";
declare namespace xlink="http://www.w3.org/1999/xlink";
declare namespace type="simple";
declare namespace href="http://www.nltaxonomie.nl/nt11/bd/20161207/entrypoints/bd-rpt-vpb-aangifte-2016.xsd";
let $doc :=
<xbrli:xbrl>
<xbrli:context id="ContextDurationDeclarant">
<xbrli:entity>
<xbrli:identifier scheme="www.belastingdienst.nl/identificatie">800004449</xbrli:identifier>
</xbrli:entity>
<xbrli:period>
<xbrli:startDate>2016-01-01</xbrli:startDate>
<xbrli:endDate>2016-12-31</xbrli:endDate>
</xbrli:period>
<xbrli:scenario>
<xbrldi:explicitMember dimension="bd-dim-dim:PartyDimension">bd-dim-mem:Declarant</xbrldi:explicitMember>
</xbrli:scenario>
</xbrli:context>
</xbrli:xbrl>
return
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Database dump</title>
</head>
<body>
<b>XML Content</b>
{
for $xbrl in $doc
return
<pre>
Identifier: { $xbrl/xbrli:context/xbrli:entity/xbrli:identifier/string() }
</pre>
}
</body>
</html>
XML-документ действительно нуждается в объявленном пространстве имен
<?xml version="1.0" encoding="UTF-8"?>
<xbrli:xbrl xmlns:xbrli="http://www.xbrl.org/2003/instance" xmlns:xbrldi="http://xbrl.org/2006/xbrldi">
<xbrli:context id="ContextDurationDeclarant">
<xbrli:entity>
<xbrli:identifier scheme="www.belastingdienst.nl/identificatie">800004449</xbrli:identifier>
</xbrli:entity>
<xbrli:period>
<xbrli:startDate>2016-01-01</xbrli:startDate>
<xbrli:endDate>2016-12-31</xbrli:endDate>
</xbrli:period>
<xbrli:scenario>
<xbrldi:explicitMember dimension="bd-dim-dim:PartyDimension">bd-dim-mem:Declarant</xbrldi:explicitMember>
</xbrli:scenario>
</xbrli:context>
</xbrli:xbrl>