ePI IG for APAC markets
0.1.0 - ci-build
ePI IG for APAC markets, published by Gravitate Health Project. This guide is not an authorized publication; it is the continuous build for version 0.1.0 built by the FHIR (HL7® FHIR® Standard) CI Build. This version is based on the current content of https://github.com/cander2/aseanepi/ and changes regularly. See the Directory of published versions
To provide standardized instructions for structuring ePI content; and ensure the consistency, clarity and quality of ePIs across organizations, jurisdictions, and regulators. These recommendations are subject to local regulatory rules. Refer to local regulatory guidance for actual requirements.
A Technical Style Guide defines the standard format and structure for writing technical documents within or across organizations. This is of great value to the international ePI project because the associated technologies and standards (e.g., XML, HTML, style sheets) are highly flexible and offer a wide array of options.
The risk of divergence is therefore high if all organizations and regulators across jurisdictions chose to structure their ePIs in different ways. Although still compliant with FHIR, the resulting divergence could complicate global implementation and maintenance. This results in an unnecessary increase in software development and maintenance costs and process inefficiencies.
Through standardization, we ensure ePI content is more consistent, accessible, easier to maintain, interoperable across systems, is more search engine friendly, and more friendly for artificial intelligence.
The content of this guide is not novel. It consolidates a selection of common best practices from Health Level 7 (HL7), web development, and web standards for convenience.
By default, the structured elements of a FHIR document are based on Extensible Markup Language (XML) or JavaScript Object Notation (JSON).
However, there is an exception for Narrative text (E.g., paragraphs, lists, images, tables, hypertext links). Whether the ePI is XML or JSON, the narrative text is captured as EXtensible HyperText Markup Language (XHTML) or Markdown.
Markdown is a simplified standard for structuring plain text. In an ePI, Markdown is used in data fields that only require brief, basic text (E.g., Document title, section heading title).
XHTML is used in data fields that require full rich narrative text of varying lengths (E.g., paragraphs of text, tables, lists, images in the section content of a drug label).
For example, here is an ePI section structured with XML (Red) and narrative as XHTML (Blue):
<section id="7c4f5a60-0d4e-ee11-be6e-000d3aaa06fe"> <title value="1. What X is and what it is used for" /> <code> <coding> <system value="https://spor.ema.europa.eu/v1/lists/200000029659/terms/" /> <code value="200000029895" /> <display value="1. What X is and what it is used for" /> </coding> </code> <text> <status value="generated" /> <div xmlns="http://www.w3.org/1999/xhtml"> <p>The therapeutic indications in line with section 4.1 of the SmPC should be stated here. It should be stated in which age group the medicine is indicated, specifying the age limits, e.g. “X is used to treat {specify indication} in”.</p> </div> </text> </section>
For example, here is an ePI section structured with JSON (Red) and the narrative as XHTML (Blue):
{ "title" : "1. What X is and what it is used for", "code" : { "coding" : [ { "system" : "https://spor.ema.europa.eu/v1/lists/200000029659/terms/", "code" : "200000029895", "display" : "1. What X is and what it is used for" } ] }, "text" : { "status" : "additional", "div" : "<div xmlns=\"http://www.w3.org/1999/xhtml\"><p>The therapeutic indications in line with section 4.1 of the SmPC should be stated here. It should be stated in which age group the medicine is indicated, specifying the age limits, e.g. “X is used to treat {specify indication} in</p></div>" } }
Text style refers to visual characteristics applied to the whole document to achieve an overall look and feel. E.g., Font type, Font size, Font colour, Table borders, Table cell shading, type of bullets.
Inline text formatting refers to visual characteristics applied to specific portions of text within the document. E.g., Bold, italic, superscript, subscript, hypertext link.
Inline text lives within a ePI document. Styles are applied from outside the document using a Style Sheet. A style sheet is made up of one or both of the following:
Keeping style and content separate is a key benefit of structured content. Keeping them separate in an ePI document ensures the following:
In most jurisdictions WCAG Level AA is recommended for use.
The default standard for all content characters is Unicode Transformation Format 8-bit (UTF-8).
UTF-8 is a character encoding standard used to ensure text is presented consistently when exchanged across systems.
All text must be contained within one of the following five tags:
Content Span <span>
The paragraph tag <p> can contain text and inline formatting tags as children. E.g.,
The <strong> and <em> tags are used to give semantic meaning to text.
<strong> is used to indicate that the text has strong importance or emphasis. It typically renders the text in bold.
<em> This tag is used to emphasize text, usually rendering it in italics.
The bold tag <b> and italics tag <i> are only used to convey the appearance of text and do not convey any semantic meaning.
Developers can use the semantic meaning behind <strong> and <em> tags to deliver benefits like the following:
Note:
The style attribute can be added to tags to apply inline formatting. E.g.,
<p style="text-decoration: underline">Underlined Sub-heading</p>
or
<p>Example of how to <span style="text-decoration: underline">underline</span> specific text</p>
The following is a list of classes that can be used together with the style attribute:
Class | Description | Style |
---|---|---|
bold | Bold Text | { font-weight: bold } |
italics | Italics Text | { font-style: italic } |
underline | Underlined Text | { text-decoration: underline } |
strikethrough | Strikethrough Text | { text-decoration: line-through } |
left | Left Aligned | { text-align : left } |
right | Right Aligned | { text-align : right } |
center | Center Aligned | { text-align : center } |
justify | Justified | { text-align : justify } |
border-left | Border on the left | { border-left: 1px solid grey } |
border-right | Border on the right | { border-right: 1px solid grey } |
border-top | Border on the top | { border-top: 1px solid grey } |
border-bottom | Border on the bottom | { border-bottom: 1px solid grey } |
arabic | List is ordered using Arabic numerals: 1, 2, 3 | { list-style-type: decimal } |
little-roman | List is ordered using little Roman numerals: i, ii, iii | { list-style-type: lower-roman } |
big-roman | List is ordered using big Roman numerals: I, II, III | { list-style-type: upper-roman } |
little-alpha | List is ordered using little alpha characters: a, b, c | { list-style-type: lower-alpha } |
big-alpha | List is ordered using big alpha characters: A, B, C | { list-style-type: upper-alpha } |
disc | List bullets are simple solid discs | { list-style-type: disc } |
circle | List bullets are hollow discs | { list-style-type : circle } |
square | List bullets are solid squares | { list-style-type: square } |
unlist | List with no bullets | { list-style-type: none } |
Lists are defined using the Unordered List tag <ul> (i.e., bulleted list) or the Ordered List tag <ol> (i.e., numbered or alphabetical list).
<ul> and <ol> tags must only contain List Item <li> tags as children. List Item <li> tags can contain other tags as children; e.g., divider <div>, paragraph <p>, heading <h1> to <h6>, images <img>, and tables <table>.
For example, this shows how to multiple paragraphs in a single bullet.
XML format | Display Text Format |
---|---|
<ul> <li> <div> <p>Bullet text with paragraphs</p> <p> next paragraph in the bullet </p> </div> </li> <li>Next bullet</li> </ul> |
Bullet text with paragraphs next paragraph in the bullet Next bullet |
Nested lists are made by adding another layer of <ul> or <ol> tags as children to a List.
For example, this shows how to create a nested list with a leading paragraph.
XML format | Display Text Format |
---|---|
<ol> <li> Bullet text #1 </li> <li> <div><p>Bullet text #2</p> <ul> <li>Sub-bullet text #1</li> <li>Sub-bullet text #2</li> </ul> </div> </li> </ol> |
|
The Anchor tag <a> and its attributes are used to represent hypertext links. E.g.,
The following characters are reserved in XML for specific purposes and must be escaped. E.g., Within the ePI’s XML, ampersand “&” cannot be used in narrative text. “&” must be used in its place.
Web browsers and apps will always convert the escaped form “&” back to the normal form “&”. The escaped form is only reserved for the XML content.
Special character | Must be replaced by the escaped form | Escaped form required in the XML |
---|---|---|
Ampersand | & | & |
Less-than | < | < |
Greater-than | > | > |
Quotes | " | " |
Apostrophe | ' | ' |
Symbols can be added as regular text as long as they are UTF-8 compliant or they can be replaced with named entities. Like the escape characters mentioned in Section 4.4, web browsers or applications convert named entities back to the normal symbol in the display.
The following table is a list of commonly use symbols. Refer to the HTML specification or W3C resources for a more comprehensive list.
Result | Description | Name | Number |
---|---|---|---|
non-breaking space | |||
< | less than | < | < |
> | greater than | > | > |
≤ | less than or equal to | ≤ | |
≥ | greater than or equal to | ≦ | |
& | ampersand | & | & |
" | double quotation mark | " | " |
' | single quotation mark | ' | ' |
¢ | cent | ¢ | ¢ |
£ | pound | £ | £ |
¥ | yen | ¥ | ¥ |
€ | euro | € | € |
© | copyright | © | © |
® | trademark | ® | ® |
° | degree sign | ° | ° |
β | beta | β |
Diacritical marks work in a similar manner as symbols with named entities. The following table is a list of commonly use marks. Refer to the HTML specification or W3C resources for a more comprehensive list.
Mark | Character | Construct | Result |
---|---|---|---|
` | a | à | à |
´ | a | á | á |
^ | a | â | â |
~ | a | ã | ã |
` | O | Ò | Ò |
´ | O | Ó | Ó |
^ | O | Ô | Ô |
~ | O | Õ | Õ |
The table tag <table> and its children (see table below) are used to structure a table.
Only <thead>, <tbody>, <tfoot>, <caption>, and <colgroup> tags are permitted as children of <table>.
The <th> and <td> tags may contain inline elements, paragraphs, headings, lists, and image tags as children. Only include text or content in <caption>, <th>, <td>, and <tfoot>. All other tags are only used for structure.
Note: Avoid using Tables for formatting and alignment. There are alternative best practice solutions that achieve the same objective in a standardized manner.
Tag | Description |
---|---|
<table> | Defines a table |
<caption> | Defines a table caption or table title (Always keep the table title inside the table) |
<th> | Defines a header cell in a table |
<tr> | Defines a row in a table |
<td> | Defines a cell in a table |
<colgroup> | Specifies a group of one or more columns in a table for formatting |
<col> | Specifies column properties for each column within a <colgroup> element |
<thead> | Groups the header content in a table |
<tbody> | Groups the body content in a table |
<tfoot> | Groups the footer content in a table (Always keep the table footnotes inside the table) |
<rowspan> | Defines how many cells to merge across rows |
<colspan> | Defines how many cells to merge across columns |
Text alignment | Attribute applied to define text alignment in a table: style="text-align: left; vertical-align: top;" style="text-align: center; vertical-align: middle;" style="text-align: right; vertical-align: bottom;" |
Example: Simple Table
Header 1 | Header 2 | Header 3 |
1 | 2 | 3 |
4 | 5 | 6 |
Example: Merge cells across columns
Header 1 | Header 2 | Header 3 |
12 | 3 | |
4 | 5 | 6 |
Example: Merge cells across rows
Header 1 | Header 2 | Header 3 |
1 | 2 | 36 |
4 | 5 |
The preferred format for images is Scalable Vector Graphics (SVG). SVG is an XML based format that can be scaled to any size without losing quality. SVG is ideal for graphics that need to look sharp at any size. This is ideal for ePI since graphics need to be resized for different size screens (wearable, mobile, desktop); or resized to suit printed cartons, paper leaflets, and instructions for use.
All images must be embedded within the ePI’s XML as Base64 objects. This allows an ePI to be exchanged as a single XML or JSON file. Each image is managed as a single Base64 object in a single Contained Binary resource within the ePI. E.g.,
<contained> <Binary> <id value="companylogo" /> <contentType value="image/svg+xml" /> <data value="Base64 data goes here" /> </Binary> </contained>
The image tag <img> is then placed in the content to show where the image is supposed to go. E.g.,
<text> <status value="generated" /> <div xmlns="http://www.w3.org/1999/xhtml"> <p><img src="#companylogo" alt="Company logo" />Product Name</p> </div> </text>
Note:
It is best practice not to embed audio or video files within an ePI given their large size. Instead, the ePI should link to external copies of audio and video files.
Note: Check local regulations to confirm if audio and video files are allowed to be used with an ePI.
Each language should be a separate ePI document. E.g., one ePI for English and a separate ePI for its French translation.
The style sheet will be used to control the direction of text. E.g., the XML may show Arabic text as left to right but the style sheet will convert the content to correctly show as right to left; Japanese will appear as left to right but the style sheet can convert the content to show as top to bottom or right to left pages.
Mathematical Markup Language (MathML) or similar structured mathematical notations are not compliant with the FHIR specification at this time. Simple formulas can be recreated in the narrative. For example, (a + b)2 could be expressed as:
<p>a + b2</p>
Complex formulas must be incorporated into the ePI as an image and then referenced in the text using the image tag <img> (Refer to section 5.4 for guidance on images).