使用 MarkLogic XQuery 查询 XBRL 实例中存在的实体标识符
Querying the entity identifiers present in an XBRL instance with MarkLogic XQuery
我正在使用 MarkLogic 的 Xquery 控制台来使用它并查询我的 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 显然有问题,因为我只得到空序列。请帮助我!
改为:
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>
你已经调用了你的变量 $xbrli:context
但你只是 select doc("test.xml")/xbrli:xbrl
而不是你似乎想要的 doc("test.xml")/xbrli:xbrl/xbrli:context
。
Martin 和 Loren 都说得有道理,我还有一些针对 XBRL 的评论。
既要在for子句的XPath中加上xbrli:context
,又要在标识符中加上/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
元素必须在return子句之外,因为在一般情况下,同一个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上使用descendant-or-self特性:
{
for $entity in distinct-values(
doc("test.xml")//xbrli:identifier
)
return <pre>Identifier: { $entity }</pre>
}
最后,在许多文件中,XBRL 事实甚至会为实体报告一个更友好的名称(在 SEC 文件中,它是 dei:EntityRegistrantName
),而实体标识符将为您提供 CIK(也报告为 dei:EntityCentralIndexKey
).
我正在使用 MarkLogic 的 Xquery 控制台来使用它并查询我的 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 显然有问题,因为我只得到空序列。请帮助我!
改为:
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>
你已经调用了你的变量 $xbrli:context
但你只是 select doc("test.xml")/xbrli:xbrl
而不是你似乎想要的 doc("test.xml")/xbrli:xbrl/xbrli:context
。
Martin 和 Loren 都说得有道理,我还有一些针对 XBRL 的评论。
既要在for子句的XPath中加上xbrli:context
,又要在标识符中加上/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
元素必须在return子句之外,因为在一般情况下,同一个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上使用descendant-or-self特性:
{
for $entity in distinct-values(
doc("test.xml")//xbrli:identifier
)
return <pre>Identifier: { $entity }</pre>
}
最后,在许多文件中,XBRL 事实甚至会为实体报告一个更友好的名称(在 SEC 文件中,它是 dei:EntityRegistrantName
),而实体标识符将为您提供 CIK(也报告为 dei:EntityCentralIndexKey
).