FHIR Release 3 (STU)

Переводит компания Health Samurai . Приглашаем поучаствовать в русификации стандарта FHIR: GitHub , Email.

2.5.0 Расширяемость

FHIR Infrastructure Рабочая группаУровень зрелости: 5Статус голосования: Пробное использование

Данный стандарт обмена данными основывается на универсальных и общепринятых клинических требованиях, учитывает различные функциональные подходы, соответствует предметным областям здравоохранения и реалиям стран и территорий мира. Для конкретных реализаций характерно иметь действующие требования, которые не являются частью этих согласованных общепринятых требований. Стремление учесть все возможные требования в рамках одной спецификации сделало бы её слишком объёмной и труднореализуемой. Поэтому ожидается, что все специфические требования будут реализованы в расширениях.

По существу, расширения - это фундаментальная часть проекта этой спецификации. Любой элемент ресурса может иметь элемент-потомок, являющийся его расширением (extension), для представления дополнительной информации, которая не входит в базовое определение ресурса (basic definition of the resource). Приложения не должны отказываться от обработки ресурса только из-за наличия расширений, однако причиной отказа может служить содержимое расширения.

Обратите внимание, что, в отличие от других стандартов, FHIR не имеет "предрассудков" в отношении использования расширений каким-либо программным обеспечением, проектом или стандартом вне зависимости от учреждения или страны или территории, определяющей раcширение. Использование расширений позволяет спецификации FHIR сохранить свою простоту для каждого.

Для того чтобы сделать применение расширений безопасным и контролируемым, были приняты строгие правила их определения и использования. Хотя разработчики могут самостоятельно давать определения и использовать расширения, существует набор требований, соблюдение которых обязательно.

Все элементы в ресурсе или типы данных могут иметь неограниченное число необязательных элементов-потомков "extension". Ниже представлена модель содержимого расширения, применимая ко всем ресурсам:

Structure

ИмяФлагиКард.ТипОписание и ограниченияdoco
.. Extension IElementOptional Extensions Element
+ Must have either extensions or value[x], not both
Элементы, определённые в прародителе: id, extension
... url 1..1uriidentifies the meaning of the extension
... value[x] 0..1*Value of extension

doco Документация по этому формату

XML Template

<extension|modifierExtension xmlns="http://hl7.org/fhir" url="identifies the meaning of the extension (uri)"> doco
 <!-- from Element: extension -->
 <value[x]><!-- 0..1 * Value of extension --></value[x]>
</extension|modifierExtension>

Turtle Template


@prefix fhir: <http://hl7.org/fhir/> .

[
 # from Element: Element.extension
  fhir:Extension.url [ uri ]; # 1..1 identifies the meaning of the extension
  # Extension.value[x] : 0..1 Value of extension. One of these 38
    fhir:Extension.valueBase64Binary [ base64Binary ]
    fhir:Extension.valueBoolean [ boolean ]
    fhir:Extension.valueCode [ code ]
    fhir:Extension.valueDate [ date ]
    fhir:Extension.valueDateTime [ dateTime ]
    fhir:Extension.valueDecimal [ decimal ]
    fhir:Extension.valueId [ id ]
    fhir:Extension.valueInstant [ instant ]
    fhir:Extension.valueInteger [ integer ]
    fhir:Extension.valueMarkdown [ markdown ]
    fhir:Extension.valueOid [ oid ]
    fhir:Extension.valuePositiveInt [ positiveInt ]
    fhir:Extension.valueString [ string ]
    fhir:Extension.valueTime [ time ]
    fhir:Extension.valueUnsignedInt [ unsignedInt ]
    fhir:Extension.valueUri [ uri ]
    fhir:Extension.valueAddress [ Address ]
    fhir:Extension.valueAge [ Age ]
    fhir:Extension.valueAnnotation [ Annotation ]
    fhir:Extension.valueAttachment [ Attachment ]
    fhir:Extension.valueCodeableConcept [ CodeableConcept ]
    fhir:Extension.valueCoding [ Coding ]
    fhir:Extension.valueContactPoint [ ContactPoint ]
    fhir:Extension.valueCount [ Count ]
    fhir:Extension.valueDistance [ Distance ]
    fhir:Extension.valueDuration [ Duration ]
    fhir:Extension.valueHumanName [ HumanName ]
    fhir:Extension.valueIdentifier [ Identifier ]
    fhir:Extension.valueMoney [ Money ]
    fhir:Extension.valuePeriod [ Period ]
    fhir:Extension.valueQuantity [ Quantity ]
    fhir:Extension.valueRange [ Range ]
    fhir:Extension.valueRatio [ Ratio ]
    fhir:Extension.valueReference [ Reference ]
    fhir:Extension.valueSampledData [ SampledData ]
    fhir:Extension.valueSignature [ Signature ]
    fhir:Extension.valueTiming [ Timing ]
    fhir:Extension.valueMeta [ Meta ]
]

Changes since DSTU2


Extension
Extension.value[x] Add Age, Add Count, Add Distance, Add Duration, Add Money

See the Full Difference for further information

Structure

ИмяФлагиКард.ТипОписание и ограниченияdoco
.. Extension IElementOptional Extensions Element
+ Must have either extensions or value[x], not both
Элементы, определённые в прародителе: id, extension
... url 1..1uriidentifies the meaning of the extension
... value[x] 0..1*Value of extension

doco Документация по этому формату

XML Template

<extension|modifierExtension xmlns="http://hl7.org/fhir" url="identifies the meaning of the extension (uri)"> doco
 <!-- from Element: extension -->
 <value[x]><!-- 0..1 * Value of extension --></value[x]>
</extension|modifierExtension>

Turtle Template

@prefix fhir: <http://hl7.org/fhir/> .

[
 # from Element: Element.extension
  fhir:Extension.url [ uri ]; # 1..1 identifies the meaning of the extension
  # Extension.value[x] : 0..1 Value of extension. One of these 38
    fhir:Extension.valueBase64Binary [ base64Binary ]
    fhir:Extension.valueBoolean [ boolean ]
    fhir:Extension.valueCode [ code ]
    fhir:Extension.valueDate [ date ]
    fhir:Extension.valueDateTime [ dateTime ]
    fhir:Extension.valueDecimal [ decimal ]
    fhir:Extension.valueId [ id ]
    fhir:Extension.valueInstant [ instant ]
    fhir:Extension.valueInteger [ integer ]
    fhir:Extension.valueMarkdown [ markdown ]
    fhir:Extension.valueOid [ oid ]
    fhir:Extension.valuePositiveInt [ positiveInt ]
    fhir:Extension.valueString [ string ]
    fhir:Extension.valueTime [ time ]
    fhir:Extension.valueUnsignedInt [ unsignedInt ]
    fhir:Extension.valueUri [ uri ]
    fhir:Extension.valueAddress [ Address ]
    fhir:Extension.valueAge [ Age ]
    fhir:Extension.valueAnnotation [ Annotation ]
    fhir:Extension.valueAttachment [ Attachment ]
    fhir:Extension.valueCodeableConcept [ CodeableConcept ]
    fhir:Extension.valueCoding [ Coding ]
    fhir:Extension.valueContactPoint [ ContactPoint ]
    fhir:Extension.valueCount [ Count ]
    fhir:Extension.valueDistance [ Distance ]
    fhir:Extension.valueDuration [ Duration ]
    fhir:Extension.valueHumanName [ HumanName ]
    fhir:Extension.valueIdentifier [ Identifier ]
    fhir:Extension.valueMoney [ Money ]
    fhir:Extension.valuePeriod [ Period ]
    fhir:Extension.valueQuantity [ Quantity ]
    fhir:Extension.valueRange [ Range ]
    fhir:Extension.valueRatio [ Ratio ]
    fhir:Extension.valueReference [ Reference ]
    fhir:Extension.valueSampledData [ SampledData ]
    fhir:Extension.valueSignature [ Signature ]
    fhir:Extension.valueTiming [ Timing ]
    fhir:Extension.valueMeta [ Meta ]
]

Changes since DSTU2

Extension
Extension.value[x] Add Age, Add Count, Add Distance, Add Duration, Add Money

See the Full Difference for further information

Примечания:

  • url - это обязательный атрибут / свойство, который используется как идентификатор извлекаемого extension definition, применяемого по отношению к данному ресурсу и определяющего содержимое и семантику элемента расширения
  • The url SHALL be a URL, not a URN (e.g. not an OID or a UUID), and it SHALL be the canonical URL of a StructureDefinition that defines the extension. Except for child extensions defined within a complex extensions, the URL SHALL be an absolute URL). The StructureDefinition that defines the extension SHOULD be available at the identified location so that resource processors can access the definition from the URL
  • Расширение ДОЛЖНО иметь либо значение (т. е. элемент value[x]), либо вложенные расширения, но не и то, и другое. Если присутствует, элемент value[x] ДОЛЖЕН иметь содерижмое (атрибует value или другие элементы)
  • Если для приложения, обрабатывающего содержимое ресурса, не безопасно игнорировать расширение, это должно быть представлено по-другому (см. ниже)
  • Фактическим именем элемента value[x] является слово "value", к которому добавляется с большой буквы имя одного из следующих определенных типов, а его содержимым будет то, которое определено для этого типа:

Вот пример расширения в XML-формате:

<name>
  <extension url="http://hl7.org/fhir/StructureDefinition/iso-21090-name-use" >
    <valueCode value="I" />
  </extension>
  <text value="Chief Red Cloud"/>
</name>

В этом примере элемент name с текстом = "Chief Red Cloud" расширен кодом использования со значением "Indigenous" (определено в ISO 21090, однако редко используется на практике).

В JSON-формате расширения описываются точно также:

{
    "extension" : [{
      "url" : "http://hl7.org/fhir/StructureDefinition/iso-21090-name-use",
        "valueCode" : "I"
     }],
     "text" : "Chief Red Cloud"
}   

Явное указание типов в представлении означает, что все системы могут читать и писать (и, следовательно, хранить и/или обмениваться) расширениями корректно без необходимости доступа к определению расширения.

Отметьте, что JSON-представление расширений для примитивных типов данных обрабатывается по-другому. См. более подробную информацию в разделе Представление примитивных типов в JSON.

Расширения также могут содержать расширения либо потому, что определение расширения само описывает сложносоставное содержимое - то есть вложенное дерево значений в расширении, либо потому, что расширение расширено дополнительным расширением, определенным отдельно.

В случае, когда расширение описывает сложное содержимое, идентификаторы частей расширения являются локальными/относительными по отношению к ссылке на определение расширения.

В качестве примера давайте рассмотрим расширение ресурса "пациент" статусом принятия участия в клиническом исследовании, содержащем три поля: номер клинического исследования, период участия и основание участия. В XML:

<Patient>
  <extension url="http://hl7.org/fhir/StructureDefinition/patient-clinicalTrial" >
    <extension url="NCT" >
      <valueString value="123456789" />
    </extension>
    <extension url="period" >	  
      <valuePeriod>
        <start value="2009-03-14" />	  
      </valuePeriod>
    </extension>
    <extension url="reason" >	  
      <valueCodeableConcept>	  
        <coding>	  	    
          <system value="http://acme.org/codes/general" />	  
          <code value="tt14j" />	  
        </coding>	  	    
      </valueCodeableConcept>	  
    </extension>
  </extension>
  <!-- other data for patient -->
</Patient>

Или в JSON:

{
  "resourceType" : "Patient",
  "extension" : [{
    "url" : "http://hl7.org/fhir/StructureDefinition/patient-clinicalTrial",
    "extension" : [{ 
      "url" : "NCT",
      "valueString" : "123456789"
    }, {
      "url" : "period", 
      "valuePeriod" : {
         "start" : "2009-03-14" 
      }   
    },  {
      "url" : "reason",
      "valueCodeableConcept" : {
          "coding" : [{
             "system" : "http://acme.org/codes/general",
             "code" : "tt14j"
          }]
      }
    }]
  }]
}

Как видно по URL, это расширение определено в рамках данной спецификации.

Это расширение можно снова расширить, добавив расширение "registrar":

Регистратор определен как отдельное расширение (например организацией-реализатором), а не как часть официального расширения clinical-trial. Поэтому URL-адрес расширения будет другим. В XML:

<Patient>
  <extension url="http://hl7.org/fhir/StructureDefinition/patient-clinicalTrial" >
    <extension url="NCT" >
      <valueString value="123456789" />
    </extension>
    <extension url="period" >	  
      <valuePeriod>
        <start value="2009-03-14" />	  
      </valuePeriod>
    </extension>
    <extension url="reason" >	  
      <valueCodeableConcept>	  
        <coding>	  	    
          <system value="http://acme.org/codes/general" />	  
          <code value="tt14j" />	  
        </coding>	  	    
      </valueCodeableConcept>	  
    </extension>
    </extension>
    <extension url="http://acme.org/fhir/StructureDefinition/registrar" >
      <valueReference>
        <reference value="Practitioner/example" />	  	    
      </valueReference>	  
    </extension>
  <!-- other data for patient -->
</Patient>

или в JSON:

{
	"resourceType": "Patient",
	"extension": [{
		"url": "http://hl7.org/fhir/StructureDefinition/patient-clinicalTrial",
		"extension": [{
			"url": "NCT",
			"valueString": "123456789"
		},
		{
			"url": "period",
			"valuePeriod": {
				"start": "2009-03-14"
          }
		},
		{
			"url": "reason",
			"valueCodeableConcept": {
				"coding": [{
					"system": "http://acme.org/codes/general",
					"code": "tt14j"			
				}]
       }
		},
		{
			"url": "http://acme.org/fhir/StructureDefinition/registrar",
			"valueReference": {
				"reference": "Practitioner/example"
      }
    }]
  }]
}

В некоторых случаях содержащаяся в расширении информация изменяет значение родительского элемента. Обычно это означает, что элемент "extension" выполняет логическую функцию отрицания (negation) или уточняет (qualifier) значение родительского элемента. Рассмотрим некоторые примеры:

  • Антипредписание: с помощью элемента "extension" можно выразить запрет на прием лекарственного средства
  • Элемент "extension" ресурса Condition (Клиническое состояние) позволяет сформировать запись, в которой говорится о том, что у пациента есть не само это клиническое состояние, а запись о нем в семейном анамнезе
  • Элемент "extension" информирует о том, что исполнитель (performer) не принимал участие в выполнениипроцедуры (Procedure)
  • Элемент "extension" декларирует дополнительную взаимосвязь категоризации для концепта в value set

Такие расширения называются расширениями-модификаторами. По возможности, реализаторам следует избегать использования расширений-модификаторов. Любое их использование должно быть тщательно продуманно, рассмотрены возможные негативные последствия. Часто использование уточняющих элементов обусловлено бизнес-требованиями и договоренностями об использовании ресурсов. Стандарт FHIR предлагает методологию для разрешения подобных случаев. Когда в ресурсе присутствует расширение-модификатор (Modifier Extension), нельзя быть уверенным в его корректной обработке приложением, если оно не содержит инструкций по его обработке.

Стандарт FHIR разрешает выносить расширения-модификаторы (Modifier Extensions) в базовую структуру ресурса или в структуру любого другого элемента, которому не соответствует какой-либо тип данных (например элементы, которые соответсвуют классам в UML-диаграммах ресурсов). Elements that are data types, or that are inside data types SHALL NOT have modifier extensions, and extensions SHALL NOT have modifier extensions internally.

Отметьте, что сложные расширения могут иметь элементы, помеченные как модификаторы (Is-Modifier = true), что означает, что эти элементы изменяют само значение расширения.

STU Note: Is this a problem? Input from implementers identifying places where modifier extensions might be needed inside other extensions is welcome here .

В XML эти элементы-модификаторы представлены с помощью элемента modifierExtension, который имеет такое же содержимое, как и элемент extension, описанный выше:

Пример: у ресурса MedicationRequest нет элемента, чтобы сделать "антипредписание" - инструкцию не принимать медикамент некоторый период времени. Классические системы медицинских записей не записывают это как предписание, а какая-то одна система записывает, и эти "антипредписания" необходимо совместно использовать в учреждении, где это происходит, так как они являются важной частью рабочего процесса. Поэтому приложениям разрешается расширять ресурс такими данными, как:

<MedicationRequest>
  <modifierExtension url="http://example.org/fhir/StructureDefinition/anti-prescription">
    <valueBoolean value="true"/>
  </modifierExtension>
  <!-- ... other content ... -->
</MedicationRequest>

Или в JSON:

{
  "resourceType" : "MedicationRequest",
  "modifierExtension" : [{ 
    "url" : "http://example.org/fhir/StructureDefinition/anti-prescription",
    "valueBoolean" : "true"
      }],
  .. other content ... 
}

Реализации стандарта, обеспечивающие обработку данных в ресурсах, ДОЛЖНЫ проверять наличие модификаторов везде, где они могли бы появиться, и если расширение-модификатор присутствует, ДОЛЖНЫ выполнить одно из следующих действий:

  1. понять влияние расширения на использование данных
  2. отказаться обрабатывать эти данные
  3. выдать предупреждение относительно данных и любых действий или выходных данных, которые возникают в результате их обработки, чтобы проинформировать пользователей о неполном понимании информации источника

обработка данных ресурса обычно представляет собой копирование или фильтрацию данных ресурса для последующего их использования в ином контексте (для представления пользователю, в целях поддержки принятия решения, для частичного обмена данных в ином формате или их сохранения для этого вида использования). Серверы и фоновые процессы, которые обеспечивают простое перемещение данных без каких-либо изменений, не выполняют "обработку данных ресурса", а значит этим приложениям не требуется выполнять проверку наличия неизвестных расширений-модификаторов.

#1: Если приложение понимает семантику расширения, это является результатом того, что разработчик подготовил соответствующие инструкции по интерпретации содержимого с учетом существования расширения-модификатора.

#2: Это значит, что от конкретных реализаций, по сути, не требуется "поддерживать" расширение-модификатор любым существенным способом - они могут достигнуть этого понимания отклонением экземпляров, которые содержат это расширение (a server, for instance, could return a HTTP 422 status code with an OperationOutcome if a client PUTs or POSTs a modifier extension it does not know. Приложения могут также игнорировать расширение-модификатор, если знают, что это безопасно делать в своем собственном контексте, хотя это не будет, как правило, иметь место.

Обратите внимание, что конкретные реализации могут иметь возможность быть уверенными благодаря их среде реализации (например особое соглашение торговых партнеров), что расширения-модификаторы никогда не будут использоваться, и, следовательно, выполнить требование проверки наличия модификаторов уже на стадии проектирования. Тем не менее, так как условия интеграции и внедрения часто изменяются, приложениям всё равно СЛЕДУЕТ всегда проверять наличие расширений-модификаторов при обработке ресурсов.

#3: Один из способов предупредить пользователя - это загрузить определение расширения по имеющемуся URL и затем использовать заданный элемент display name для представления расширения пользователю. Сообщение об ошибке может выглядеть так:

Обратите внимание: описательная (человекочитаемая) часть ресурса (narrative) ДОЛЖНА содержать эту модифицирующую информацию, чтобы её можно было безопасно показать пользователю в качестве выражения содержимого ресурса. Диалоговое окно с предупреждением можно расширить и предложить пользователю просмотреть оригинальный текст описательной части ресурса.

Вот пример предписания, приведенного выше, с описательной частью:

<MedicationRequest xmlns="http://hl7.org/fhir">
  <text>
    <status value="generated"/>
    <div xmlns="http://www.w3.org/1999/xhtml">
      <p><b>Note: This prescription is an instruction NOT to take a medication</b></p>
      <!-- snip actual narrative -->
    </div>
  </text>
  <!-- ...data... -->
  <modifierExtension url="http://example.org/fhir/StructureDefinition/anti-prescription">
    <valueBoolean value="true"/>
    </modifierExtension>
  <!-- ...data... -->
</MedicationRequest>

Приложению необходимо беспокоиться о расширениях-модификаторах только тех элементов, которые она обрабатывает. Возьмем, к примеру, случай, где в ресурсе procedure на одном из элементов performer есть modifierExtension, обозначающее, что они не участвовали в этой процедуре. Если приложение не обрабатывает элемент performer вообще, то тот факт, что один из элементов performer содержит modifierExtension, будет несущественным, и приложение может свободно игнорировать его. Если оно всё же обрабатывает элементы performer и встречает модифицирующее расширение, оно должно действовать одним из перечисленных выше способов.

  • Расширение-модификатор ДОЛЖЕН влиять только на тот элемент и/или потомки этого элемента, который их содержит
  • Всегда ДОЛЖНО быть безопасно показать описательную часть людям; все расширения-модификаторы дОЛЖНЫ быть представлены в этой описательной части
  • Приложения всегда ДОЛЖНЫ проверять наличие расширений-модификаторов при обработке данных из любого элемента, который может их содержать
  • Если присутствует расширение-модификатор, который приложение не понимает, приложение ДОЛЖНО либо отказаться обрабатывать такой ресурс или затронутый элемент, либо должно выдать соответствующее предупреждение своим пользователям

В некоторых случаях разработчики могут обнаружить, что у них нет данных для элемента с минимальным кардинальным числом = 1. В таком случае элемент обязательно должен присутствовать, но пока ресурс или соответствующий ему интеграционный профиль не потребует наличия реального значения (соответствующего простым типам данных), такой элемент может иметь расширение, объясняющее, почему значение примитивного типа отсутствует.

<uri>
  <extension url="http://hl7.org/fhir/StructureDefinition/data-absent-reason">
    <code="unknown"/>
  </extension>
</uri>

В данном примере вместо значения (value) указывается код отсутствия данных (data missing code). Обратите внимание, что использование расширения такого типа необязательно. Данный элемент-расширение нельзя считать модификатором (modifier extension), т. к. ему не присваиваются значения, соответствующие примитивным типам данных.

Неправильно создавать формальное наполнение элемента (fictional piece of data) с содержимым, соответствующим примитивным типам данных, а затем включать в элемент расширение, определяющее добавление данных в целях обеспечения соответствия. Данное решение было бы неправильным еще и потому, что недопустимо использовать элемент "modifierExtension" для уточнения типов данных.

Элементы-расширения позволяют отражать локальные потребности здравоохранения с помощью подхода, основанного на универсальной [модели] информации. Это необходимо, чтобы медицинские системы могли работать с ресурсами с помощью одинаковых средств и инструментов. Однако, когда речь идет об обработке информации (содержищейся в ресурсах и уточненной расширениями), приложения будут ограничены в обработке расширений в той степени, в которой они располагают данными о них.

Несмотря на то, что каждое выражение (expression) должно сопровождаться описанием его структуры (structure definition) (см. далее подробности), само по себе наличие описания не означает, что приложение понимает, как правильно обрабатывать расширение. В целом, всегда требуется решение человека, чтобы определить, каким образом будут использоваться данные в элементах-расширениях, и какие обязательства в отношении данной информации должны выполняться.

По этой причине локальные потребности, которые находят отражение в форме расширений, препятствуют интеграции и совместимости. Чем больше требований являются универсальными (например на региональном или общегосударственном уровне), тем меньшее влияние они оказывают на процессы интеграции. Согласованное представление, определение и регистрация расширений, описанных в данной спецификации, не поможет решить существующую проблему. Необходима методология, которая упростит работу с локальными вариантами ресурсов.

Внедрение медицинских приложений, обеспечивающих поддержку локальных потребностей, часто сопровождается ситуацией, при которой обменивающиеся информацией приложения поддерживают разные наборы расширений. Спецификация FHIR устанавливает ряд простых правил, направленных на управления такими ситуациями, однако не способна предложить решения для такого рода несоответствий.

  • При обмене ресурсами системы МОГУТ, по возможности, сохранять неизвестные расширения (так же как и базовые элементы ресурса)
  • Если система изменяет ресурс, она МОЖЕТ удалить любые расширения, семантика которых для нее непонятна. Необходимо удалять элемент-модификатор и все его элементы-потомки, потому что изменения, вносимые в ресурс, могут сделать элемент-расширение некорректным
  • Системы, удаляющие (drop) существующие элементы, занимаются "обрабаткой ресурса" ("processing the resource")
  • Система НЕ ДОЛЖНА изменять ресурсы или элементы, которые содержат элементы-модификаторы с неясной семантикой
  • Приложения МОГУТ игнорировать расширения с неясной семантикой, если эти расширения не изменяют значение родительского элемента
  • Системы, которые не принимают (к обработке) неизвестные расширения, ДОЛЖНЫ указывать это в экземплярах ресурса CapabilityStatement

То, в какой степени приложения должны сохранять неизвестные элементы-расширения зависит от функциий, которые они выполняют: FHIR-сервер общего назначения или промежуточная платформа (middleware engine) сохраняют все расширения, в то время, как приложения, используемые для управления данными пациентов (последством пользовательского интерфейса) при регистрации, сохраняют только те, из неизвестных расширений, которые входят в набор информации, непосредственно обрабатываемой пользователем.

Используйте следующие правила в качестве руководства для обработки ресурсов:

  • При написании расширений убедитесь, что они имеют [формализованное] описание и находятся в открытом доступе
  • При чтении, навигации или поиску по элементам, которые могут иметь расширения-модификаторы, проверяйте их на наличие расширений-модификаторов
  • При чтении элементов читайте и обрабатывайте расширения, которые вам известны, и игнорируйте другие расширения
  • Фиксируйте расширения, где это возможно