Использование Simple XML для построения XBRL, как реализовать пространство имен - PullRequest
0 голосов
/ 06 февраля 2020

Я использую Simple XML для создания XML для использования в качестве XBRL.

Вопрос:

Как реализовать пространство имен на дочернем элементе правильный путь, используя Simple XML в качестве базы?

Наблюдения:

  • Отсутствует пространство имен (таким образом, нет [xbrli: xbrl], [se-cd-base: CompanyName].

  • Отсутствует строка кодирования.


Мой код:

<?php

$test_array = [
  'TheCompany' => 'CompanyName'
];

$xml = new SimpleXMLElement('<xbrli/>');
array_walk_recursive($test_array, array ($xml, 'addChild'));
print $xml->asXML();

Результат

<?xml version="1.0"?>
<xbrli>
  <CompanyName>
    TheCompany
  </CompanyName>
</xbrli>

Требуемый результат (XBRL)

<?xml version="1.0" encoding="UTF-8"?>

  <xbrli:xbrl xmlns:link = "http://www.xbrl.org/2003/linkbase">

  <link:schemaRef
    xlink:type="simple"
    xlink:href="http://xbrl.taxonomier.se/se/fr/gaap/k2/risbs/2017-09-30/se-k2-risbs-2017-09-30.xsd"/
    >

  <se-cd-base:CompanyName
    contextRef="period0">
    TheCompany
  </se-cd-base:CompanyName>

</xbrli:xbrl>

1 Ответ

1 голос
/ 08 февраля 2020

При использовании пространств имен в документе XML необходимо учитывать три вещи:

  • URI пространства имен . Это глобально уникальный идентификатор, который инструменты распознают как одно и то же пространство имен (URI не должен нигде указывать, это просто способ организации того, кто «владеет» идентификатором).
  • * местный префикс . Это произвольная строка, которая конкретный документ или даже часть документа ассоциируется с конкретным URI пространства имен, в основном просто для того, чтобы сделать вещи более компактными. Это часть перед тегом : в теге типа <xbrli:xbrl>. Существует также пространство имен по умолчанию для каждой части документа, для элементов без префикса.
  • Элемент или имя атрибута в этом пространстве имен. Эта часть после : в теге, подобном <xbrli:xbrl>.

Я упоминаю все это, чтобы понять, почему предоставленный вами образец XML недействителен, потому что похоже, что вы хотите используйте четыре пространства имен:

  1. Пространство имен http://www.xbrl.org/2003/linkbase, которому вы дали местный префикс link
  2. Неизвестное пространство имен, которому вы дали местный префикс xbrli; Я назову это http://example.org/xbrli
  3. Неизвестное пространство имен, которому вы дали местный префикс se-cd-base; Я назову это http://example.org/se-cd-base
  4. Неизвестное пространство имен, которому вы дали местный префикс xlink; Я назову это http://example.org/xlink (если это не было опечаткой и не должно было быть другой ссылкой на http://www.xbrl.org/2003/linkbase?)

Теперь давайте попробуем создать действительную версию вашего XML, используя Простой XML ...

Сначала нам нужно создать элемент root, который находится в пространстве имен http://example.org/xbrli; Простой XML не может создать документ без каких-либо узлов, поэтому мы должны написать первый узел вручную и проанализировать его:

// Using xbrli as prefix for http://example.org/xbrli
$xml = new SimpleXMLElement('<xbrli xmlns="http://example.org/xbrli"/>');
// Or using http://example.org/xbrli as the default namespace for the document
$xml = new SimpleXMLElement('<xbrli xmlns="http://example.org/xbrli"/>');

Далее нам нужен дочерний элемент schemaRef в http://www.xbrl.org/2003/linkbase пространстве имен. Мы делаем это путем , передавая пространство имен в качестве третьего параметра в addChild и включая префикс в имя элемента, если мы хотим его:

// Using link as the prefix for http://www.xbrl.org/2003/linkbase
$schemaRef = $xml->addChild('link:schemaRef', null, 'http://www.xbrl.org/2003/linkbase');
// Or making http://www.xbrl.org/2003/linkbase the default namespace for this section
$schemaRef = $xml->addChild('schemaRef', null, 'http://www.xbrl.org/2003/linkbase');

Далее мы хотим добавить атрибуты в пространстве имен http://example.org/xlink. Аргументы для addAttribute аналогичны приведенным выше, но префикс обязателен:

$schemaRef->addAttribute('xlink:type', 'simple', 'http://example.org/xlink');
$schemaRef->addAttribute('xlink:href', 'http://xbrl.taxonomier.se/se/fr/gaap/k2/risbs/2017-09-30/se-k2-risbs-2017-09-30.xsd', 'http://example.org/xlink');

Теперь повторите для элемента CompanyName; обратите внимание, что атрибуты без префиксов имеют довольно странное определение в пространствах имен spe c, но мы сохраним его в соответствии с вашим примером:

$CompanyName = $xml->addChild('se-cd-base:CompanyName', 'The Company', 'http://example.org/se-cd-base');
// Again, we can declare a default namespace rather than a prefix:
$CompanyName = $xml->addChild('CompanyName', 'The Company', 'http://example.org/se-cd-base');
// Attribute with no namespace
$CompanyName->addAttribute('contextRef', 'period0');

Теперь соберите все вместе и проверьте с echo $xml->asXML(); и мы получаем что-то вроде этого (пробел добавляется вручную):

<?xml version="1.0"?>
<xbrli xmlns="http://example.org/xbrli">
    <link:schemaRef
        xmlns:link="http://www.xbrl.org/2003/linkbase" 
        xmlns:xlink="http://example.org/xlink"
        xlink:type="simple"
        xlink:href="http://xbrl.taxonomier.se/se/fr/gaap/k2/risbs/2017-09-30/se-k2-risbs-2017-09-30.xsd"
    />
    <se-cd-base:CompanyName 
        xmlns:se-cd-base="http://example.org/se-cd-base" 
        contextRef="period0"
    >The Company
    </se-cd-base:CompanyName>
</xbrli>

Или эквивалентный документ, использующий пространства имен по умолчанию, а не префиксы:

<?xml version="1.0"?>
<xbrli xmlns="http://example.org/xbrli">
    <schemaRef 
        xmlns="http://www.xbrl.org/2003/linkbase"
        xmlns:xlink="http://example.org/xlink"
        xlink:type="simple"
        xlink:href="http://xbrl.taxonomier.se/se/fr/gaap/k2/risbs/2017-09-30/se-k2-risbs-2017-09-30.xsd"
    />
    <CompanyName
        xmlns="http://example.org/se-cd-base"
        contextRef="period0"
    >
    The Company
    </CompanyName>
</xbrli>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...