Our current work can be downloaded from MicroFormats. Our summary of the issues that have arisen from this work follows:
Assumptions
1. That XHTML validity is not required
Our chosen approach embeds the metadata within the HTML using custom attributes and non-HTML tags. This results in invalid XHTML. The alternative approach (the "microformats" method) is very much more verbose and makes it less easy to extract the XBRL.
We believe that XHTML validity is not important, because browsers are almost invariably designed to cope with HTML which is not even well-formed, and that ease of processing, and simplicity, are much more significant. The approach we are taking, of using custom attributes and tags, already has a precedent - embedded SVG.
2. That it must be possible to round-trip the data
Renderings of XBRL instance documents are not always required to display all the data held in the underlying document. For instance, the XBRL instance document may include static data which is by convention not displayed:
<ae:CompanyNotDormant contextRef='y2003'>true</ae:CompanyNotDormant>
We have assumed that such data must be included in the XHTML document, but with instructions to the browser that it should not be displayed. For instance:
<span style="display:none;" tag:name="ae:CompanyNotDormant" tag:contextRef="y2003">true</span>
Unless this is assumed, we cannot ensure that the XBRL instance document is the same as that which would have been created by the originator of the data.
3. That DTS discovery is not required for extraction of the instance data
It is highly preferable that it should be possible to generate the XBRL instance, from the XHTML document, without having to refer to the DTS.
4. The use of Micro-XBRL markup should be processor-independent
For convenience, we have developed a style-sheet written in XSLT v2.0. We expect that real-world applications may be developed in a number of languages, including XSLT v1.0, Java, and JavaScript.
Design decisions
1. Unconventional handling of tuples in the current stylesheet
One particular problem with tuples is making sure they are grouped correctly at the extraction stage. For example, the following fragment from an instance conforming to the UK GAAP taxonomy:
<pt:EquityAuthorisedDetails> <pt:TypeOrdinaryShare contextRef='y2003'>A shares</pt:TypeOrdinaryShare> <pt:NumberOrdinarySharesAuthorised precision='INF' contextRef='e2003' unitRef='shares'>1000</pt:NumberOrdinarySharesAuthorised> <pt:ParValueOrdinaryShare precision='INF' contextRef='y2003' unitRef='GBP'>1</pt:ParValueOrdinaryShare> <pt:ValueOrdinarySharesAuthorised precision='INF' contextRef='e2003' unitRef='GBP'>1000</pt:ValueOrdinarySharesAuthorised> <pt:ValueOrdinarySharesAuthorised precision='INF' contextRef='e2002' unitRef='GBP'>1000</pt:ValueOrdinarySharesAuthorised> </pt:EquityAuthorisedDetails>
could be output as:
<pt:EquityAuthorisedDetails> <pt:TypeOrdinaryShare contextRef='y2003'>A shares</pt:TypeOrdinaryShare> <pt:NumberOrdinarySharesAuthorised precision='INF' contextRef='e2003' unitRef='shares'>1000</pt:NumberOrdinarySharesAuthorised> <pt:ParValueOrdinaryShare precision='INF' contextRef='y2003' unitRef='GBP'>1</pt:ParValueOrdinaryShare> <pt:ValueOrdinarySharesAuthorised precision='INF' contextRef='e2003' unitRef='GBP'>1000</pt:ValueOrdinarySharesAuthorised> </pt:EquityAuthorisedDetails> <pt:EquityAuthorisedDetails> <pt:TypeOrdinaryShare contextRef='y2003'>A shares</pt:TypeOrdinaryShare> <pt:NumberOrdinarySharesAuthorised precision='INF' contextRef='e2003' unitRef='shares'>1000</pt:NumberOrdinarySharesAuthorised> <pt:ParValueOrdinaryShare precision='INF' contextRef='y2003' unitRef='GBP'>1</pt:ParValueOrdinaryShare> <pt:ValueOrdinarySharesAuthorised precision='INF' contextRef='e2002' unitRef='GBP'>1000</pt:ValueOrdinarySharesAuthorised> </pt:EquityAuthorisedDetails>
We have temporarily resolved this by using table element around the tuple elements that are to be grouped. Thus:
table width="100%">
<tr tag:name="pt:EquityAuthorisedDetails">
<td style="display:none;" tag:name="pt:TypeOrdinaryShare" tag:contextRef='y2003'>A shares</td>
<td style="display:none;" tag:name="pt:NumberOrdinarySharesAuthorised" tag:precision='INF' tag:contextRef='e2003' tag:unitRef='shares'>1000</td>
<td style="display:none;" tag:name="pt:ParValueOrdinaryShare" tag:precision='INF' tag:contextRef='y2003' tag:unitRef='GBP'>1</td>
<td class="rightalign" style="width:50%;" tag:name="pt:ValueOrdinarySharesAuthorised" tag:contextRef='e2003' tag:unitRef='GBP' tag:precision='INF' tag:scale="1">1,000</td>
<td class="rightalign" style="width:50%;" tag:name="pt:ValueOrdinarySharesAuthorised" tag:contextRef='e2002' tag:unitRef='GBP' tag:precision='INF' tag:scale="1">1,000</td>
</tr>
</table>However, this solution will not work with all possible table and tuple constructions. The longer term solution to this problem is to use idrefs.
Open issues
[Moved to IWD]
Regarding the inline XBRL approach's stylesheet transformation to XBRL, in addition to open issues already identified:
- Syntax for scaling of numbers. [Now in IWD.]
How to concatenate nonnumeric fact values that appear disconnected in the original HTML; they usually must be merged into a single fact in the output XBRL. In the current draft posted at http://StandardAdvantage.com/inlineXBRL this is not handled nicely, it produces a separate fact for each disconnected chunk of text. Putting class="noxbrl" on an XHTML element prevents it from appearing in the XBRL. For a general approach to this mapping, see http://StandardAdvantage.com/UGT/Narratives.