<?xml version="1.0" encoding="UTF-8"?>
<metanorma xmlns="https://www.metanorma.org/ns/standoc" type="semantic" version="2.6.5" schema-version="v2.0.4" flavor="ribose">
<bibdata type="standard">
<title language="en" format="text/plain">LutaML — Language reference</title>
<docidentifier primary="true" type="Ribose">RS 3001</docidentifier><docnumber>RS 3001</docnumber><date type="published"><on>2024-03-10</on></date><contributor><role type="author"/><organization>
<name>Ribose Inc.</name>
<address><formattedAddress>167-169 Great Portland Street<br/>5th Floor<br/>London<br/>W1W 5PF<br/>United Kingdom</formattedAddress></address></organization></contributor><contributor><role type="author"/><person>
<name><completename>Ronald Tse</completename></name>
<affiliation><organization>
<name>Ribose</name>
</organization></affiliation></person></contributor><contributor><role type="publisher"/><organization>
<name>Ribose Inc.</name>
<address><formattedAddress>167-169 Great Portland Street<br/>5th Floor<br/>London<br/>W1W 5PF<br/>United Kingdom</formattedAddress></address></organization></contributor><edition>1.0</edition><language>en</language><script>Latn</script><status><stage>published</stage></status><copyright><from>2025</from><owner><organization>
<name>Ribose Inc.</name>
<address><formattedAddress>167-169 Great Portland Street<br/>5th Floor<br/>London<br/>W1W 5PF<br/>United Kingdom</formattedAddress></address></organization></owner></copyright><ext><doctype>standard</doctype><flavor>ribose</flavor><editorialgroup><committee type="technical">LutaML</committee></editorialgroup><security>unrestricted</security></ext></bibdata><metanorma-extension><presentation-metadata><name>TOC Heading Levels</name><value>2</value></presentation-metadata><presentation-metadata><name>HTML TOC Heading Levels</name><value>2</value></presentation-metadata><presentation-metadata><name>DOC TOC Heading Levels</name><value>2</value></presentation-metadata><presentation-metadata><name>PDF TOC Heading Levels</name><value>2</value></presentation-metadata></metanorma-extension>
<boilerplate><copyright-statement>

<clause id="_e6d5240d-324b-88ca-a190-956ea435c32e" obligation="normative">
<p id="_96cc8bbb-9d9a-ff6c-98e9-9a7a9b0a5def">© Ribose Inc. 2025</p>
</clause>
</copyright-statement>

<legal-statement>

<clause id="_7c9b34cc-5853-55f8-f0b6-1d5149135a25" obligation="normative">
<p id="_50bbfa02-61c3-8332-bad8-61e7389d1808">All rights reserved. Unless otherwise specified, no part of this publication may be reproduced or utilized otherwise in any form or by any means, electronic or mechanical, including photocopying, or posting on the internet or an intranet, without prior written permission. Permission can be requested from the address below.</p>
</clause>
</legal-statement>

<feedback-statement>

<clause id="_836ec555-8fe8-ed0b-96d7-ba7230d4cfaa" obligation="normative">
<p id="boilerplate-name" align="left">Ribose Inc.</p>

<p id="boilerplate-address" align="left">167-169 Great Portland Street<br/>5th Floor<br/>London<br/>W1W 5PF<br/>United Kingdom<br/><br/><link target="mailto:copyright@ribose.com"/><br/><link target="https://www.ribose.com">www.ribose.com</link></p>
</clause>
</feedback-statement>
</boilerplate><preface><introduction id="_introduction" obligation="informative">
<title>Introduction</title>
<p id="_d40034e3-59b1-02a2-ddad-358a311a34bc">LutaML is a language for defining information models and instances of those information models.</p>

<p id="_556a1c61-2a49-6b57-2aa2-146552b3f9b6">Traditionally, different languages have been developed to define information models for disparate purposes.</p>

<ul id="_23c75e01-4ee8-bce0-f4b8-2ed7914336f2"><li><p id="_c75fa310-cdec-1c1b-070d-20ad44e617e0">Data modeling languages are used to define and describe information models in a structured and formalized manner to document and interchange such model designs. Models defined in these formats are not meant to be directly usable in programming languages or serialization formats.</p>
</li>
<li><p id="_49310a45-dde4-b0e8-58dd-084413b106b6">Schema languages are used to define serialization formats that can be used to serialize and deserialize data in a specific format. These formats are not meant to be directly usable in programming languages or information models.</p>
</li>
<li><p id="_b97b5e66-7a0a-79b5-f77a-cad8baa0bdc5">Serialization formats are used to serialize and deserialize data according to some schema or in a “schema-less” model. These formats are not directly useable as information models.</p>
</li>
<li><p id="_ec7a79b3-62df-c4f7-883d-b2c851802ea8">Programming language constructs are used to define data structures that can be used in software applications. These constructs are not directly useable as information models or serialization formats nor communicated across systems.</p>
</li>
</ul>

<example id="_10233f32-0569-bdc6-21f1-e5c38a03e82a"><p id="_6075f285-2704-9cc8-f0f5-5c79d82fb813">Traditionally, multiple layers of languages and tools are used to work with information models:</p>

<ul id="_bb50d5ad-0720-3666-0597-7d3b5efcd46f"><li><p id="_1dd3ce81-c208-f63b-6f63-c3198af94587">UML for defining information models</p>
</li>
<li><p id="_514bf176-75b5-677a-1f61-2e65e9a77681">XML Schema or JSON Schema for defining serialization formats</p>
</li>
<li><p id="_dc1d34cd-024c-30dd-9f15-1f2b8d3adf14">Programming language implementations for both the models and their serialization mechanisms</p>
</li>
</ul>
</example>

<p id="_019729a0-9bf1-5db3-2375-9a3f5de07270">LutaML is a single language that incorporates all the above roles of information modeling.</p>

<p id="_5ab0b167-c970-1be2-11e8-3d910887db80">The goal of LutaML is to provide a single language that can be used to:</p>

<ul id="_aee72ea4-5cc6-1349-d14d-09f1e1634cb4"><li><p id="_5fd9b4fa-d918-9542-c204-68873e97b2e8">define information models that are human-readable and interchangeable</p>
</li>
<li><p id="_39834332-3e08-46bc-d7e1-5bead63c7ca8">specify serialization formats of information models</p>
</li>
<li><p id="_4b9afa65-028f-ddad-4358-730dff1507df">parse, validate, and utilize those information models in programming languages</p>
</li>
</ul>
</introduction></preface><sections>
<clause id="_scope" type="scope" obligation="normative">
<title>Scope</title>
<p id="_b4900097-a912-7df3-e6fb-6c3a90682695">This document defines the core syntax and semantics of the Luta Modeling Language (LutaML), a domain-specific language for defining data models and instances of those data models.</p>

<p id="_ac36e88c-7192-a587-a2d3-6de185815a03">Other aspects of the LutaML language are defined in separate documents.</p>
</clause>



<terms id="_terms_and_definitions" obligation="normative">
<title>Terms and definitions</title><p id="_1fbc7bf1-a8de-c3eb-ee88-3b4cf950e61b">For the purposes of this document, the following terms and definitions apply.</p>

<term id="term-information-model"><preferred><expression>
<name>information model</name>
</expression>
</preferred>
<definition><verbal-definition><p id="_c66372b3-3f80-265e-08f3-9b3efc3ac31c">representation of information in a structured manner</p></verbal-definition></definition>
 </term>

<term id="term-model"><preferred><expression>
<name>model</name>
</expression>
</preferred>
<definition><verbal-definition><p id="_255c8e66-013f-7bc7-a0ef-69bf891d7854">abstract representation of a category of information</p></verbal-definition></definition>


 <termnote id="_4f90f238-17ca-ca87-4225-d0efd7ad8d1f"><p id="_4ac378de-1f6e-99c4-4314-6ae2356f752d">Commonly, a collection of classes, enums, and relationships defining a data structure, facilitating the organization of information and its metadata.</p>
</termnote></term>

<term id="term-class"><preferred><expression>
<name>class</name>
</expression>
</preferred>
<definition><verbal-definition><p id="_92459697-0438-73dc-16ca-3637b14aaf43">defined characteristics of a type of object, including attributes and constraints</p></verbal-definition></definition>
 </term>

<term id="term-enum"><preferred><expression>
<name>enum</name>
</expression>
</preferred>
<definition><verbal-definition><p id="_523e904c-487a-7e90-b130-87edda899f63">predefined set of values</p></verbal-definition></definition>
 </term>

<term id="term-instance"><preferred><expression>
<name>instance</name>
</expression>
</preferred>
<definition><verbal-definition><p id="_c544a962-9158-8369-7e04-4eaea4cb39c9">data conforming to a class definition</p></verbal-definition></definition>
 </term>

<term id="term-attribute"><preferred><expression>
<name>attribute</name>
</expression>
</preferred>
<definition><verbal-definition><p id="_f86990ff-b3cf-c039-add6-2bf68674a549">characteristic of a property of a <concept><refterm>class</refterm><renderterm>class</renderterm><xref target="term-class"/></concept></p></verbal-definition></definition>


 <termnote id="_e88b9d22-fb22-3b38-fe90-25e8ff92a232"><p id="_93412afb-91c9-1e22-5ce7-6e07e5f6c45b">Commonly defined by a name, type, and cardinality</p>
</termnote></term>

<term id="term-reference"><preferred><expression>
<name>reference</name>
</expression>
</preferred>
<definition><verbal-definition><p id="_df7569b7-5306-d1ff-e1a3-ffbf58a47066">relationship between instances</p></verbal-definition></definition>


 <termnote id="_a11b2bbf-e835-c387-efd7-e853745c1dca"><p id="_eebfd754-23b9-cfc0-4d3c-bf35fcfa25d5">Can be implemented as pointer to another instance or attribute.</p>
</termnote></term>

<term id="term-cardinality"><preferred><expression>
<name>cardinality</name>
</expression>
</preferred>
<definition><verbal-definition><p id="_c1cb366d-c6b7-f386-60ec-00344770e946">allowed number of values for an attribute</p></verbal-definition></definition>


 <termnote id="_dba1bebc-cfb6-d462-b79b-8ce4cc7c8cc6"><p id="_c848a8fb-5e27-f0fb-5efb-40f7bba8a6b6">Commonly expressed as a range (e.g., 0..1, 1..n).</p>
</termnote></term>
</terms>

<clause id="_purpose" obligation="normative">
<title>Purpose</title>
<clause id="_data_modeling" obligation="normative">
<title>Data modeling</title>
<p id="_fdd0bda1-bac2-7ecc-679e-3a9827c42ef8">Information is stored and used as data in digital systems. Digital systems rely on defined structures to store, retrieve and manipulate data in a consistent manner.</p>

<p id="_833c306e-3994-d326-27ce-e09f92400be8">A data model is a structured representation of the data that describes the properties of the data, the relationships between different data elements, and any rules or constraints that govern the data.</p>

<p id="_64d1bdba-6f68-27ae-fee7-3c6361e98ff3">Data modeling is the process of creating a data model.</p>

<p id="_f15c0ebb-569a-5087-98ea-73fba2fe9bdb">Many data modeling languages exist, each with its own syntax and semantics.</p>

<example id="_e377769d-13ea-bc6a-ebb5-347a3adbe356"><p id="_c025f9f2-c698-8e00-91c6-2860b46f5ce5">UML (Unified Modeling Language) is a general-purpose modeling language that can be used to model a wide variety of information.</p>
</example>

<example id="_582d3d6e-4a09-7d9a-114b-b13bf8f968fa"><p id="_f411c4a2-ad8f-51fd-8221-b7a4907db282">EXPRESS is a data modeling language designed to represent information requirements.</p>
</example>

<p id="_b6fc7f4a-724e-20a2-5e5d-7d679ed94a3b">Commonly languages that define data models are called “conceptual modeling languages”.</p>

<p id="_52595edc-fbe5-771d-a319-4360ec8a1d4c">While many data modeling languages are used to define data models in a way that is independent of underlying technologies used, most data modeling languages do not provide a way to define how data is represented in an information system.</p>

<p id="_cef7ba25-8824-9a11-8cda-e043d6e05067">For example, information models in UML are mostly used for diagramming and documentation purposes, and do not provide a way to define how the data can be accessed or used in programming languages.</p>
</clause>

<clause id="_serialization" obligation="normative">
<title>Serialization</title>
<p id="_2fe2e6fc-f8d8-bd18-4ed6-7ca902d09d7a">Serialization is the process of converting data structures or objects into a format that can be stored or transmitted between systems. Typically, this involves converting the data into a string of bytes that can be written to a file or sent over a network.</p>

<p id="_0b5cd7fc-bfd6-a799-54cb-dbeffc8be68b">Serialization formats are very important in allowing systems to exchange structured information in an interoperable manner without loss of semantics.</p>

<example id="_5d07acdb-efa6-3ea1-f2fe-41334570b68f"><p id="_0461cfd5-4679-1969-80d6-b7a4e29c8c31">Common serialization formats include JSON, XML, and YAML.</p>
</example>

<p id="_8d6197a5-6d14-c6af-31a2-e434a4d73829">Serialization formats often come with a schema language that allows for the definition of particular data structures that data needs to conform to.</p>

<example id="_ec67c936-37d1-2590-1c79-5b00a2daad4a"><p id="_765abf56-04c7-ac48-b646-232b317a0a2f">XML Schema, JSON Schema, and YAML Schema represent the schema languages for XML, JSON, and YAML, respectively.</p>
</example>

<p id="_aa557bed-a584-ffac-7655-16fe87e83d6e">Typically, languages that define serialization formats are called “schema languages”.</p>

<p id="_5ff96fdf-88be-f263-f45e-b4b98fb0bf8e">A conceptual model may be realized (“implemented”) in multiple serialization formats. For example, some standards define a conceptual model in UML and provide manually-defined transformation rules to XML and JSON.</p>
</clause>

<clause id="_access_in_programming_languages" obligation="normative">
<title>Access in programming languages</title>
<p id="_5088549b-f7fe-21d0-63da-88d34f44670e">Information defined by conceptual data models and serialization schema languages are not directly usable in a native manner in programming languages or APIs.</p>

<p id="_fbeaee3c-f53f-65a7-0b48-45f3f2e462a7">At the conceptual data model level, there is no direct mapping to programming language constructs. For example, a UML class diagram does not directly map to a Java class.</p>

<p id="_7e45303d-c2b8-f3fe-8e5d-61a423d60a34">There are tools that attempt to generate code from UML models, yet the generated code will require manual integration and intervention to be usable in software.</p>

<p id="_484380ed-2074-8922-0e9c-1a680eb8882e">At the serialization schema language level, there is again no direct access from the programming language to the schema language constructs. For example, a JSON Schema does not directly map to a Java class. Typically developers will write code that parses the schema and/or implement code to read and write data in the format defined by the schema.</p>

<p id="_99286186-6a56-a23b-543e-e3eaa3e5ae56">The lack of direct access to data models and serialization formats in programming languages makes it difficult to work with structured data in a consistent manner across different systems and technologies.</p>
</clause>

<clause id="_interleaving_conceptual_modeling_and_serialization_format_modeling" obligation="normative">
<title>Interleaving conceptual modeling and serialization format modeling</title>
<p id="_39dcb8a9-3784-e031-1755-8638defa7eab">Conceptual modeling focuses on the definition of the existence and relationships of data elements.</p>

<p id="_36dce654-8d43-4696-439d-4cda9050cbda">Serialization data modeling focuses on low-level details of how data is represented in a particular format.</p>

<p id="_51f0e714-362c-5212-aad1-b183ae35855e">For example, a conceptual model may define that a <tt>Date</tt> object has<tt>year</tt>, <tt>month</tt>, <tt>day</tt> attributes, and each of them are of an <tt>Integer</tt> type and potentially the numbering constraints for each attribute, and that there are certain restrictions to what the attributes can be at an attribute level (valid values of <tt>month</tt> range from 1 to 12), or at the object level (only a leap year is allowed to have 29 days in February). It does not specify how many bytes are to be used to represent an <tt>Integer</tt> or how the <tt>Date</tt> object is to be written in a file.</p>

<p id="_5b710e0b-06cd-97d4-32e2-de76991373a4">A serialization data model (using a schema language) may define that a <tt>Date</tt> object is represented as a sequence of 3 Integers, each representing the <tt>year</tt>, the <tt>month</tt>, and the <tt>day</tt>, respectively, and that the <tt>Integer</tt> type is represented as a 4-byte unsigned integer. While the schema language may support value constraints that the <tt>month</tt> attribute must be between 1 and 12, it is unlikely that the schema language supports object-level complex constraints such as “only a leap year is allowed to have 29 days in February”. Schema languages typically do not have the expressive power to define such complex constraints.</p>

<p id="_ed5680b2-6533-94cc-a708-93714debd9ae">This presents a conundrum for the data modeler, who needs to define the entire structure and constraints, but also needs to decide where and how to define constraints that may not be definable in a schema language. This complexity explodes exponentially as the need for the same data to be represented in additional schema languages arises.</p>

<p id="_6941cddb-1ebd-c518-1116-cc3136849e31">How much of the constraints should be defined in the conceptual model? How much of the data model constraints should be defined in the serialization schema language? Do we need to define duplicated constraints in both the conceptual model and the serialization schema language if allowed? This is a question that haunts developers and data modelers alike.</p>
</clause>

<clause id="_challenges_in_data_interchange" obligation="normative">
<title>Challenges in data interchange</title>
<clause id="_general" obligation="normative">
<title>General</title>
<p id="_577ed0ef-2c2a-6cf1-310e-7df046119deb">Interchange of data between systems of a particular data model can be challenging due to multiple factors.</p>
</clause>

<clause id="_derivation_of_serialization_formats_from_conceptual_models" obligation="normative">
<title>Derivation of serialization formats from conceptual models</title>
<p id="_135b7622-1fea-f60c-2c67-a2c060a149a7">A successful, modern conceptual model is expected to support multiple serialization formats, given the variety of modern systems and tech stack components.</p>

<p id="_2705f7c8-1973-083b-f222-cf46efdb945b">While it is possible to define a conceptual model in a data modeling language, and then manually define transformation rules to convert the model into serialization formats, this is a time-consuming and error-prone process.</p>

<p id="_73e29e95-cb34-f228-fb49-d3d1b11bb0e7">This issue is exacerbated by the fact that the transformation rules are not always well-defined and may not be easily maintained. A change in the conceptual model may require changes in multiple serialization formats, and it is difficult to maintain synchronicity between the conceptual model and the serialization formats.</p>

<p id="_f17701f4-51ef-74e3-1d79-d491915d4c7f">The solution to this problem is to define a single source of truth for the data model, and then automatically derive the serialization formats from the data model.</p>

<p id="_f0d65236-8f3d-e17b-5b95-31942bd4a61f">Even with automatic derivation, there are additional concerns (addressed in this document):</p>

<ul id="_a31fbc30-eed8-2fd1-1be9-87e7ed088bd0"><li><p id="_0791ee36-b702-0d9f-156f-a7ddff093c5b">Versioning: How do we version the data model and the serialization formats?</p>
</li>
<li><p id="_5416f22f-9a46-7cbc-7052-b5fc6338ec2e">Migration: How do we migrate data from one version of the data model to another?</p>
</li>
<li><p id="_4cde4e0d-fefd-52e1-0cc7-ab8c31b699bd">Interoperability: How do we ensure that data can be exchanged between systems that use different versions of the data model?</p>
</li>
<li><p id="_c039f07f-4c49-5beb-5072-3bd5d3c193e9">Access: How do we work with different versions of the data model in a programming language?</p>
</li>
</ul>
</clause>

<clause id="_complexity" obligation="normative">
<title>Complexity</title>
<p id="_1814da73-c52b-8804-c24e-ef44548f7e27">Modern technical stacks are composed of multiple systems that are built using different technologies and data modeling languages.</p>

<p id="_5242a2ca-f7cc-b457-9d0f-4562621fa2c8">Browser-based applications may use JSON to represent data, while server-side applications may use XML. Databases may use SQL to define data structures, while APIs may use JSON Schema to define data structures.</p>
</clause>

<clause id="_model_definition_language_incompatibility" obligation="normative">
<title>Model definition language incompatibility</title>
<p id="_a10b9ed6-c4a4-399b-3fa6-3f19e9e33534">Different data modeling languages have different syntax and semantics. This makes it difficult to interchange data between systems that are defined using different data modeling languages.</p>

<p id="_868cbbc5-bac6-dd12-c38b-364a80726826">For example, a data model defined in UML may not be directly convertible to a data model defined in EXPRESS.</p>

<p id="_22f86622-4b27-6ff4-c32f-f84de889c935">When a schema language is used to define data structures, the schema language itself may not be directly convertible to another schema language.</p>

<p id="_3b7162e0-d0ad-8f54-bf32-ab04d1b5bb1f">For example, an XML Schema may not be directly convertible to a JSON Schema.</p>

<p id="_ded0adb9-d37c-f150-ccb6-4f87c29d0be3">Typical approaches used today include:</p>

<ul id="_ff322dd6-5f90-e6ea-b5cd-fb5bc1adadab"><li><p id="_a20e61da-5344-863d-7386-687c43d9421f">create a transformation toolchain that convert serialized formats to a defined serialization format, then use a codebase that can parse the defined serialization format</p>
</li>
<li><p id="_83c8690d-e74d-c75a-3b7d-3b01aa033d57">create a transformation toolchain that convert serialized formats to an intermediary representation, and then use a codebase that reads that intermediary representation.</p>
</li>
</ul>

<p id="_7d6b20ca-9a9f-458e-e6ef-a60f3c3769fb">Imagine that there are 5 serialization formats that need to be supported.</p>

<p id="_40f0e527-fb25-0e5a-53fc-aa8837144f90">Neither of these approaches is ideal, as they require additional work to be done, and may introduce errors in the transformation process.</p>
</clause>

<clause id="_semantic_incompatibility_of_conceptual_modeling_languages" obligation="normative">
<title>Semantic incompatibility of conceptual modeling languages</title>
<clause id="_general_2" obligation="normative">
<title>General</title>
<p id="_05bc230d-f7bd-620b-4863-a93e3ad39e09">Some modeling languages are at their core, incompatible with each other due to their different foundational principles and structures.</p>
</clause>

<clause id="_comparing_uml_and_express" obligation="normative">
<title>Comparing UML and EXPRESS</title>
<p id="_c95a7266-1fb0-f20f-cc9b-949d1d85516e">Both UML and EXPRESS are conceptual modeling languages intended for general use.</p>

<p id="_8f5806b6-6afb-1209-d38e-ce7458a061aa">However, some UML concepts are not directly mappable to EXPRESS concepts:</p>

<ul id="_2d039ee3-3905-ccfd-d84c-545a33bd591f"><li><p id="_4d4d4c5a-3a24-e9b5-ad4e-f1e41044d396">A UML class can have “methods”, but an EXPRESS <tt>ENTITY</tt> allows only validation logic (via <tt>WHERE</tt>, <tt>RULES</tt>, or <tt>FUNCTION</tt>/<tt>PROCEDURE</tt>), which is declarative and stateless.</p>
</li>
<li><p id="_20fb2c23-cce6-f141-8b83-37b4b419b366">EXPRESS <tt>SELECT</tt> types (flexible polymorphic unions) have no direct UML equivalent. UML generalizations or interfaces approximate <tt>SELECT</tt> but lose EXPRESS’s runtime validation semantics.</p>
</li>
</ul>
</clause>

<clause id="_comparing_uml_and_rdf" obligation="normative">
<title>Comparing UML and RDF</title>
<p id="_8a9d2288-cbbe-c27d-920a-89be4bdb3f77">UML is a class-based modeling language, while RDF is a graph-based modeling language.</p>

<ul id="_2397509e-b5c7-cd39-dcd9-b293953585a6"><li><p id="_d99665ec-ad58-7dac-82c0-0d26936a834c">The concept of encapsulation (private/public attributes) in UML is not supported in RDF.</p>
</li>
<li><p id="_10392122-cb9f-64a7-ef45-b8df0c0f269c">The property multiplicity constraints (e.g., 1..*) cannot be enforced in RDF.</p>
</li>
<li><p id="_43f87a02-8e74-48b0-1ed9-54df0425f56d">RDF applies graph-based relationships (arbitrary connections between resources) that are incompatible with the hierarchical class/object structure used in UML.</p>
</li>
</ul>
</clause>

<clause id="_approach" obligation="normative">
<title>Approach</title>
<p id="_5c6ef1d8-b4cd-b59a-490c-4f0c3094a824">It is clear that a direct mapping between certain conceptual model languages is impossible without losing some semantics.</p>

<p id="_53580429-a0a1-4d6c-5d62-20ceaa2212a2">Some communities have attempted to define mappings between conceptual model languages, which often become rather complex as re-implementations of the modeling language in another language. The result is a loss of semantics, expressivity, and deviation from the conventions, benefits, and usability of the modeling language.</p>

<p id="_b6dd97e8-8b49-7f07-4067-6ad2bc07a9de">The solution to this problem is to take a common approach that works across different conceptual modeling languages, and then define additional rules for each language to supplement the common approach.</p>
</clause>
</clause>

<clause id="_conversion_difficulties_between_serialization_formats" obligation="normative">
<title>Conversion difficulties between serialization formats</title>
<clause id="_general_3" obligation="normative">
<title>General</title>
<p id="_aa69846b-4125-ed46-4356-afec07951c4f">Some serialization formats are not directly mappable to each other, due to the differences in syntax and semantics between the formats.</p>

<p id="_2fd6c888-8864-d305-28d5-977d32195b0e">This means that a document in one serialization format cannot be directly converted to another serialization format without modification.</p>

<p id="_1e742e45-5155-9fd1-0604-7443326df4aa">These features are critical in data representation and serialization contexts.</p>
</clause>

<clause id="_comparing_yaml_schema_and_json_schema" obligation="normative">
<title>Comparing YAML Schema and JSON Schema</title>
<p id="_5f9214f5-35e1-a30b-ac83-4daeef3544bf">Though YAML Schema is derived from JSON Schema, there are differences between the two serialization formats that make direct conversion difficult without additional handling. These include:</p>

<ul id="_617f63d7-e5d7-7e0e-fafc-f51128876bb2"><li><p id="_6edb94f2-7498-49f5-3123-c0f1c558b9f9">Content-level semantic differences</p>
<ul id="_c42b3316-c0d5-bedc-c10d-cb03798b1609"><li><p id="_a1229a7b-0459-5bb5-9058-07c3a05ed1bb">Data type mismatches. YAML supports data types not native to JSON, such as date-time, symbols, and binary data. As a result, a defined transform needs to be implemented to round-trip these data types between YAML and JSON.</p>
<example id="_b1df543a-54da-126a-6657-71be5b1a57d6"><p id="_7f99385e-5ce4-666a-7883-0873d4265266">A value that is of date-time type in YAML does not have a direct equivalent in JSON. Such value is likely to be represented as a string in JSON. In a round-trip operation, the JSON-to-YAML transform needs to detect that the string is a date-time value and convert it back to a date-time value in YAML.</p>
</example>
</li>
</ul>
</li>
<li><p id="_170f9b31-753a-063e-284f-059e5504dc40">Serialization-level semantic differences</p>
<ul id="_ec6f0f95-f507-b153-89d9-513133499494"><li><p id="_734f7b68-f1af-a4f7-6c1a-478cdd73cbf9">YAML supports multi-line strings, while JSON does not. A multi-line string in YAML can be represented using modifier symbols on keys (such as the <tt>|</tt> and <tt>&gt;</tt> characters), but these are serialization-level specifics that are not part of the content model, and hence JSON would have no representation for them.</p>
<example id="_d15e5ba6-599f-4203-3fd0-306f971a0088"><p id="_d0e82b13-b442-d8c5-d13e-fc7bfda7f319">Given YAML content that uses one of these multi-line structures, a round-trip between JSON and YAML would lose the multi-line structure and end up with a single-line string in the YAML serialization.</p>
</example>
</li>
<li><p id="_e50523a8-a709-0b03-4443-b11b2642038e">YAML supports anchors and references, while JSON does not. In YAML, it is possible to define an anchor for a value and then reference that anchor in another part of the YAML document in order to reuse the value. JSON does not have a direct equivalent for this feature.</p>
<example id="_0e4cb344-5098-6563-1968-3cbf59d912eb"><p id="_200db972-d846-cf66-5fd8-3fb4a071715c">Given a YAML document that uses anchors and references, a round-trip between JSON and YAML would lose the anchor and reference structure and end up with a repeated value in the YAML serialization.</p>
</example>
</li>
</ul>
</li>
</ul>
</clause>

<clause id="_comparing_xml_schema_xsd_and_json_schema" obligation="normative">
<title>Comparing XML Schema (XSD) and JSON Schema</title>
<p id="_d3b51721-4b52-210f-0e39-76a376c5b9e7">XML Schema (XSD) is also not directly mappable to JSON Schema as XSD provides features that JSON Schema does not include, such as:</p>

<ul id="_42806c15-2264-ce09-4334-e908ef51fd2d"><li><p id="_74d926cb-6e78-78d1-0206-d7b96a498aa1">Content-level semantic differences</p>
<ul id="_1fe50f98-60b5-3d4f-2f5f-54196254c279"><li><p id="_c39d1aed-1617-9c8a-9461-7edd08b7928d">Data type mismatches. JSON Schema supports the data types of string, number, object, array, boolean, and null, while XSD supports these data types and many additional data types such as date, time, and duration.</p>
</li>
<li><p id="_fc91433d-ee45-c1f1-30cb-9b5d8073f220">Namespace support. XSD supports the concept of namespaces, while JSON Schema does not.</p>
</li>
<li><p id="_5583fc4b-b352-45b9-0ef0-d34411b957e7">Composing complex types. XSD offers the ability to define complex composite types and allows those to be reused in multiple places in the schema. JSON Schema does not have a direct equivalent for this feature.</p>
</li>
<li><p id="_023432af-be3e-f589-4a54-5ca0d877eab2">Value constraints. XSD supports placing constraints on string values using regular expressions, but JSON Schema does not have a direct equivalent for this feature.</p>
</li>
<li><p id="_8f487e27-1d4d-e205-44a2-9afbebcd9e56">Serialization order and structural constraints. XSD allows for the definition of element sequences, groups, choices, and unions. JSON Schema does not have a direct equivalent for these features.</p>
</li>
</ul>
</li>
<li><p id="_aa23b51f-a6f2-a02b-c633-d4e0eb076900">Serialization-level semantic differences</p>
<ul id="_f4f4b4a8-d4da-c269-ff31-a835da23a018"><li><p id="_484f831f-9b98-008c-044e-4eccd06f8f97">XML attributes. XSD allows for the definition of attributes on elements, while JSON Schema does not have a direct equivalent for this feature.</p>
</li>
<li><p id="_9864f87e-39fa-3a37-5986-0c9af66bd206">XML comments. XML allows comments in the schema, while JSON does not.</p>
</li>
<li><p id="_66a4dbc6-060c-4408-dbb7-1823a03d80e6">XML processing instructions. XML allows processing instructions in the schema, while JSON does not.</p>
</li>
<li><p id="_426ec8e1-ec3a-9de3-c5ed-f46696fc7eae">XML entities. XML allows entities in the schema, while JSON does not. This means that an XML file with entities will likely be represented as a string in JSON, causing a round-trip operation from XML to lose the entity structure.</p>
</li>
<li><p id="_de375edd-7465-40dd-3bef-7af1cbe08f3a">XML CDATA sections. XML allows CDATA sections in the schema, while JSON only has one type of string. This means that an XML file with CDATA sections will likely be represented as a string in JSON, causing a round-trip operation from XML to lose the CDATA structure.</p>
</li>
</ul>
</li>
</ul>
</clause>

<clause id="_approach_2" obligation="normative">
<title>Approach</title>
<p id="_7f7ad1f2-3ea7-fb25-e4db-5673b752483c">The solution to this problem is to define a common approach that works across different serialization formats, and then define additional rules for each format to supplement the common approach.</p>
</clause>
</clause>
</clause>

<clause id="_goals" obligation="normative">
<title>Goals</title>
<p id="_34a99a76-bc9d-acef-c5ff-53a20be526ea">LutaML is a system that aims to simplify users to easily define data models and work with information that conforms to those data models.</p>

<p id="_5201027a-48ee-ff87-4419-879a9077cb44">The goal of LutaML is to allow these steps to flow seamlessly:</p>

<ol id="_5ad1c488-747f-c6e9-8be8-6c19105c2698" type="arabic"><li><p id="_65088c33-fead-285a-3375-5aa3ec4a1f23">Define a platform-independent data model in a human-readable format. (LutaML language)</p>
</li>
<li><p id="_5b20d763-4ed2-71c7-9772-1883567ba54e">Allow the data model to be directly useable in a programming language. (LutaML runtime)</p>
</li>
<li><p id="_16e67fc4-ab13-04d9-1b8f-28982506557d">Allow the data model to be expressed in a serialization schema language. (LutaML language)</p>
</li>
<li><p id="_a59ac4f7-3f92-9f16-56a8-7b4fb778efcb">Allow the data model to be directly serializable to a serialization format. (LutaML runtime)</p>
</li>
<li><p id="_60cf56be-d016-fd42-25af-6806db6bff16">Support the loading of data from a serialization format into a programming language. (LutaML runtime)</p>
</li>
<li><p id="_720e8105-d22d-56f7-4e8a-d1d071d33489">Allow importing a serialization schema language to define a data model. (LutaML runtime)</p>
</li>
<li><p id="_4de55691-0b01-f958-8586-0b93470b3667">Allow the conversion of serialization formats to another through the data model. (LutaML runtime)</p>
</li>
</ol>

<p id="_4346c53e-30af-5992-5676-5a9df5fb5e56">The LutaML language provides a way to represent structured data in a human-readable format.</p>
</clause>
</clause>

<clause id="_principles" obligation="normative">
<title>Principles</title>
<p id="_f5635ec8-30f4-c090-8cf6-d08c6a07b661">The principles of LutaML are:</p>

<ol id="_61eac82f-c1be-3240-ecde-376802a6f9c9" type="arabic"><li><p id="_ea4d8146-8c31-e4ee-ba79-82091ad4e39a">Provide a human-readable syntax for defining data models.</p>
</li>
<li><p id="_c07f7bf9-cc61-14fb-9692-764cebe72e7c">Consistent language constructs.</p>
</li>
<li><p id="_7f7f5e33-4812-f213-b8f7-d10d5bff89d2">The language should be simple and easy to understand, and does not require specialized knowledge for particular serialization formats unless advance features are needed.</p>
</li>
<li><p id="_6973d1e0-fa68-beeb-52b7-f09cc60b93e7">Support modular reuse of definitions across files.</p>
</li>
<li><p id="_50c3bde0-c2e2-6116-1e62-a87285b4cd78">Support instance representation of data models.</p>
</li>
</ol>
</clause>

<clause id="_core_syntax" obligation="normative">
<title>Core syntax</title>
<p id="_e1a43c9f-6876-77d2-5b71-a2a31efa9e0c">The core syntax of LutaML is based on the following constructs:</p>

<ul id="_0d6b8f55-7b3a-4aaa-43af-0151991abf3a"><li><p id="_30bc965a-4ce8-3cbb-16fc-1abc91d20df2">primitive values</p>
</li>
<li><p id="_321d1e21-6bd6-1464-c7b9-faf98e35b38c">declaration</p>
</li>
<li><p id="_6b65b02f-8137-e1a3-2d37-1ad7f530042d">argument</p>
</li>
<li><p id="_e694da13-e578-9c13-3bc7-8294900cc1f5">block</p>
</li>
<li><p id="_3edb9c30-39a2-46c9-c7be-d0485a092158">comment</p>
</li>
</ul>

<clause id="_primitive_values" obligation="normative">
<title>Primitive values</title>
<p id="_63bf75e6-fb32-c715-4038-740cc1c96a46">Primitive values are the basic building blocks of LutaML.</p>

<p id="_834cb853-1fc2-f686-4537-862c587e8ca2">All primitive types have names that start with uppercase.</p>

<p id="_e72c6c10-db47-b43d-b896-920824cc0163">LutaML supports the following primitive values:</p>

<ul id="_d0ab4c73-3694-31a2-7c43-7875c8e668d8"><li><p id="_b1e8be75-db23-5d4d-4883-334cd3fef417"><tt>String</tt> (e.g., <tt>"high-fire"</tt>),</p>
</li>
<li><p id="_807d08d4-fcf8-2153-8806-aa81d780cdb6"><tt>Integer</tt> (e.g., <tt>42</tt>).</p>
</li>
<li><p id="_7775cf9d-4eed-c029-937a-9f3f408527c9"><tt>Float</tt> (e.g., <tt>3.5</tt>),</p>
</li>
<li><p id="_6670786a-882d-9bcb-5402-8f45839d64d5"><tt>Boolean</tt> (e.g., <tt>true</tt>),</p>
</li>
<li><p id="_8366bdf7-b6be-38d0-c999-24dffab5a51c"><tt>TimeWithoutDate</tt> (e.g., <tt>12:00:00</tt>),</p>
</li>
<li><p id="_15422288-1e9e-6373-4a9a-265a06f1cbc5"><tt>DateTime</tt> (e.g., <tt>2024-01-01T12:00:00+00:00</tt>),</p>
</li>
<li><p id="_8bc4d126-4a72-3972-b670-0d32731efaf9"><tt>Time</tt> (e.g., <tt>2024-01-01T12:00:00+00:00</tt>),</p>
</li>
<li><p id="_e7989f5e-9c55-4162-3c68-6ab66f41a05d"><tt>Decimal</tt> (e.g., <tt>3.14159</tt>),</p>
</li>
<li><p id="_f4126bda-cce5-f7be-4f7d-96308b18983b"><tt>Hash</tt> (e.g., <tt>{ "key": "value" }</tt>)</p>
</li>
</ul>
</clause>

<clause id="_declaration_arguments_and_blocks" obligation="normative">
<title>Declaration, arguments and blocks</title>
<p id="_10790e6f-44d8-5717-3b4b-0ba7ea63c352">A declaration is a keyword that represents an action or a statement.</p>

<p id="_8f434a35-0df3-cda3-5d2f-da7492b0c1a7">Syntax:</p>

<sourcecode id="_15d33a41-b16c-9e29-f667-752cbda81891" lang="lml"><body>{declaration} {*argument} {*block}</body></sourcecode>


<p id="_af69df24-35c4-637b-7c35-acd75c9eef0e">Where,</p>

<dl id="_70318bba-0d74-65ca-27c9-dcd88fd9f7b3"><dt><tt>{declaration}</tt></dt>
<dd><p id="_25b3582c-e000-eb2d-7cc8-db5b296ad7c1">the declaration keyword</p>
</dd>
<dt><tt>{*argument}</tt></dt>
<dd><p id="_3bc00fe7-f175-c92b-d84e-d54faba9e4a3">zero or more arguments</p>
</dd>
<dt><tt>{*block}</tt></dt>
<dd><p id="_56ba2443-3127-d56e-8273-8a8afc23ee39">an optional blocks</p>
</dd>
</dl>

<p id="_eeb6d841-d4b0-e8ee-2a01-3ca45d3c0c7a">An argument is a string, which can be a primitive value or a reference to another object.</p>

<p id="_5de5a040-2880-93cd-a8c6-a71da3caa389">A block is delimited by curly braces and provides a context for inner declarations.</p>

<example id="_e14c916c-e054-0298-b272-4518480ef1d7"><p id="_3f049b76-b18c-8cdc-980d-891049d18b64">This example shows the <tt>class</tt> declaration that takes an argument <tt>Studio</tt> to represent the name of the class.</p>

<sourcecode id="_2d3116c2-fa66-94a0-0ee5-c3b6c8ac5d28" lang="lml"><body>class Studio
// or
class Studio {
}</body></sourcecode>

</example>

<example id="_43771923-4293-ad9a-30a9-5e32ebbbba6f"><p id="_0a97ec58-3023-a958-988d-61f7d0bd231a">This example shows the <tt>class</tt> declaration that takes an argument <tt>Studio</tt> as its name with a block given, where it contains an attribute.</p>

<sourcecode id="_18dc5714-4b1f-df13-2247-49cb39537a45" lang="lml"><body>class Studio {
  attribute ...
}</body></sourcecode>

</example>
</clause>

<clause id="_comment" obligation="normative">
<title>Comment</title>
<clause id="_general_4" obligation="normative">
<title>General</title>
<p id="_aac1747d-6f36-2149-d287-3d4c58d8aa19">A comment is a line of text that is ignored by the processor.</p>
</clause>

<clause id="_single_line_comment" obligation="normative">
<title>Single-line comment</title>
<p id="_845b3638-8350-e2bd-1e06-3f48a9b8db0d">A single-line comment is also called a “tail comment”, a comment that appears at the end of a line.</p>

<p id="_d29d5ab4-af1b-aa82-c8d4-cd420d83d39f">The <tt>//</tt> character sequence can appear at the beginning of a line or after whitespace.</p>

<p id="_411211f5-3059-b426-63ab-6a5325b806f0">Syntax:</p>

<sourcecode id="_69c6cc7b-c151-21fc-fa73-9fcad12a8968" lang="lml"><body>// {text}
or
{expression} // {text}</body></sourcecode>


<p id="_e73e4ae8-bb4e-33eb-777c-4493e1a6fdc8">Where,</p>

<dl id="_fb49284e-cd30-1875-2f0e-e81584da1780"><dt><tt>{text}</tt></dt>
<dd><p id="_a2e6cc13-dffa-c0fa-0c5f-e95761f340c1">the comment text</p>
</dd>
</dl>

<example id="_eb06e654-270b-a6e1-cb19-86cdad3b155e"><sourcecode id="_cbf621a5-13cf-6656-411f-c56a9e9f0462" lang="lml"><body>// This is a comment</body></sourcecode> </example>

<example id="_38566a6c-da07-62e5-4cf2-5a80c06e87e2"><sourcecode id="_88e6c3a0-0754-d933-9f15-21a24276f0b8" lang="lml"><body>class Studio { // This is a comment
  attribute location, String
}</body></sourcecode> </example>

<example id="_75892f29-084d-9c51-bc61-b13bbc3b33a3"><sourcecode id="_df632cff-db50-abd1-d8cd-4ba6a78cc725" lang="lml"><body>// TODO: attributes <callout target="_2cb82eca-2dd7-889d-579b-dc81a63e775d">1</callout>
class Ceramic {
  // Write docs <callout target="_f7ea04c4-91f9-4ac4-5876-cd0d956889f0">2</callout>
  + glazeType: GlazeType // Glaze type <callout target="_ec9a6f5f-1f6f-11e9-f459-b1ce30eb17c1">3</callout>
}</body><annotation id="_2cb82eca-2dd7-889d-579b-dc81a63e775d"><p id="_1520d718-80f5-53a9-188c-d7999cf9c026">A line beginning with <tt>//</tt> is a comment.</p>
</annotation><annotation id="_f7ea04c4-91f9-4ac4-5876-cd0d956889f0"><p id="_839b1f61-ef9d-98ac-a718-b1e3d9a650ca">A line beginning with whitespaces followed by <tt>//</tt> is a comment.</p>
</annotation><annotation id="_ec9a6f5f-1f6f-11e9-f459-b1ce30eb17c1"><p id="_4cd35280-d6a1-6f8a-d00e-eab12843ab11">A line with <tt>//</tt> contains a tail comment: the text after <tt>//</tt> is a comment.</p>
</annotation></sourcecode>


</example>
</clause>

<clause id="_multi_line_comment" obligation="normative">
<title>Multi-line comment</title>
<p id="_669b4a3c-67d9-10d1-508c-a8962b1caf82">Comments can also be multi-line.</p>

<p id="_9b89831b-1b81-f3dd-d595-5fd3dae1377c">Syntax:</p>

<sourcecode id="_fc81f3f1-163e-89f5-7c22-cb354f632a49" lang="lml"><body>/* {text} */</body></sourcecode>


<p id="_98206b0c-9ca8-d486-ec86-8987734ad084">Where,</p>

<dl id="_43385627-a95b-a9ce-f47b-92f5d844ed7b"><dt><tt>{text}</tt></dt>
<dd><p id="_a0b569f2-4f3f-8372-7c21-ee0a562a3832">the comment text</p>
</dd>
</dl>

<example id="_ce97cead-4071-7980-2d9c-0cd20c06d00c"><sourcecode id="_b7ef09c9-2849-6aef-f143-395c520e251a" lang="lml"><body>/* This is a
multi-line comment */
/*
  This is also a
  multi-line comment
*/</body></sourcecode> </example>
</clause>

<clause id="_definition" obligation="normative">
<title>Definition</title>
<p id="_59aa7e63-f5a9-982d-8b96-07ac82956c77">The <tt>definition</tt> block is used to define a multiline description for a class.</p>

<p id="_476cafad-dfa6-0f29-a7d3-f541323e57bd">Syntax:</p>

<sourcecode id="_b29740c1-e51d-b29e-8c8c-53de928feefb" lang="lml"><body>definition {text}</body></sourcecode>


<p id="_56b2c87b-189e-33d1-703c-972f67f2f27c">Where,</p>

<dl id="_eca01725-c38c-2bfa-7cab-96ee0bb1e43f"><dt><tt>{text}</tt></dt>
<dd><p id="_df669848-5043-994e-5869-1b624a203676">the description text</p>
</dd>
<dt><tt>{block}</tt></dt>
<dd><p id="_94fd5252-2933-263e-ec58-3f436f611493">description text block</p>
</dd>
</dl>

<example id="_17b1d9e1-1d2f-413e-985c-6a5295183d01"><sourcecode id="_907982f9-0e7a-86c7-9103-3fff27d64c34" lang="lml"><body>definition "Non-reflective finish"</body></sourcecode> </example>

<p id="_4c45a34b-1f75-aa99-0401-5e45de1f3b86">Content within the block is considered to be multi-line textual content. No declarations are available within the block.</p>

<sourcecode id="_75a8d96a-67e8-5d15-5bc9-1f1003fd73b4" lang="lml"><body>definition {block}</body></sourcecode>


<p id="_dc580ca7-9fbe-341f-7b9e-63c6558450a5">Where,</p>

<dl id="_818a54e1-e5e2-b806-6dac-cb4ee6b3a707"><dt><tt>{text}</tt></dt>
<dd><p id="_9c3c7c10-5f28-957b-8fee-ebbee37bdcab">the description text</p>
</dd>
<dt><tt>{block}</tt></dt>
<dd><p id="_d66041c6-a91a-9d69-9c43-2bc32835f27e">description text block</p>
</dd>
</dl>

<example id="_82704bf1-d022-8561-d666-02842021b14c"><sourcecode id="_9b3d9767-3a0b-c26c-0918-1d00321a14d3" lang="lml"><body>definition {
  Non-reflective finish.

  A matte finish is a non-reflective finish that is often used in ceramics.
}</body></sourcecode> </example>

<example id="_1e7ef4cd-8834-db95-25b7-6396f1926b33">
<name>Declaring a class named “Ceramic” with a description</name>
<sourcecode id="_c3c242d5-aec4-093f-00c8-e1c0f49e4c18"><body>class Ceramic {
  definition {
    This class represents a ceramic object.
  }
}</body></sourcecode>

</example>
</clause>
</clause>
</clause>

<clause id="_representable_objects" obligation="normative">
<title>Representable objects</title>
<clause id="_general_5" obligation="normative">
<title>General</title>
<p id="_244ab581-4842-34b8-3ee4-64b80f1373bd">LutaML supports the following constructs.</p>
</clause>

<clause id="_package" obligation="normative">
<title>Package</title>
<p id="_26cf08c8-ad24-2d29-b2d5-641847e1bf30">The <tt>package</tt> construct is used to define a collection of classes and enums.</p>

<p id="_cfb80c6f-16f1-2c0d-ac4c-d398953950b2">Syntax:</p>

<sourcecode id="_2a5b66dc-686b-5086-3fc9-7708924491eb" lang="lml"><body>package {name} {block}</body></sourcecode>


<p id="_3847d747-71cf-0709-f4fc-d121f4bbfa12">Where,</p>

<dl id="_95d6c5d3-6c65-ff29-ae6d-21270130f5b3"><dt><tt>{name}</tt></dt>
<dd><p id="_ce982a63-84ae-f36b-589a-9cf9d2ce384d">the name of the package</p>
</dd>
<dt><tt>{*block}</tt></dt>
<dd><p id="_840bcc6c-5485-4127-8f3c-bf0912b9e0ed">an optional block</p>
</dd>
</dl>

<example id="_344045a3-7349-1410-4b41-91f77976c1c6"><sourcecode id="_e5c7029b-3276-0617-fd31-a03acaf3088c" lang="lml"><body>package Ceramics {
  enum FiringProfile { values { "low", "medium", "high" } }

  class CeramicTile {
    attribute dimensions, float { cardinality 2 }  // [length, width]
    attribute firing_profile, FiringProfile
  }
}</body></sourcecode> </example>

<p id="_682687ef-295a-5fc3-1ae2-72bb604c2799">The package construct can be nested. You can also define other packages within a package, which helps in organizing related classes and enums.</p>

<example id="_474dc8ec-c570-68b5-5987-19459ef50c6d"><sourcecode id="_e2cfd674-92f9-6f52-dbd6-e6056909fa09" lang="lml"><body>class Dimension {
  attribute length, float
  attribute width, float
  attribute height, float
}

package Ceramics {
  class Ceramic {
    attribute volume, float
    attribute color, String

    // Refers to outermost "root package"
    attribute dimensions, Dimension

    // Refers to "Material" package
    attribute tiles, Material::CeramicTile { cardinality 0..n }
  }

  package Materials {
    enum FiringProfile { values { "low", "medium", "high" } }

    class CeramicTile {
      // Refers to outermost "root package"
      attribute dimensions, Dimension

      // Refers to local "Materials" package
      attribute firing_profile, FiringProfile
    }
  }
}</body></sourcecode> </example>

<p id="_3b560465-602a-5086-76b0-1661afad9532">Within the block, the following declarations are available:</p>

<ul id="_c2fe0941-8f77-385d-a14a-1278cfa62794"><li><p id="_8fb84c4c-0fc3-8e8d-ff28-2faf6a3136b8"><tt>class</tt></p>
</li>
<li><p id="_28396d22-b490-73d9-b331-1e56bef49e11"><tt>enum</tt></p>
</li>
<li><p id="_ace2319d-6923-eef9-567e-096820df379f"><tt>definition</tt></p>
</li>
<li><p id="_add240f6-3a26-d308-5da0-8c3d594ce13c"><tt>package</tt></p>
</li>
</ul>
</clause>

<clause id="_class_2" obligation="normative">
<title>Class</title>
<p id="_4809448f-491a-96f1-0a5d-ab0c6daec627">The <tt>class</tt> construct is used to define a class which is a collection of attributes.</p>

<p id="_269858d1-f261-c7e6-38b0-6a005add4966">Syntax:</p>

<sourcecode id="_93ffb8e7-77c4-35ed-7ad5-72164bbfb296" lang="lml"><body>class {name} {block}</body></sourcecode>


<p id="_131ab674-b6f5-5658-b662-67beda0859dd">Where,</p>

<dl id="_173f0150-47c6-f9cc-70d8-29ad763d9f01"><dt><tt>{name}</tt></dt>
<dd><p id="_a7408092-7771-75ce-a395-f972e7ce8802">the name of the class</p>
</dd>
<dt><tt>{*block}</tt></dt>
<dd><p id="_36338206-d5bc-fcc0-4327-768e7fb461c2">an optional block</p>
</dd>
</dl>

<example id="_877f701d-b97a-1c74-484f-60d40734d6f6"><sourcecode id="_e3b8581e-e80c-1e25-0104-f35024beb959" lang="lml"><body>class Studio {
  attribute location, String {
    definition "Location of the studio"
  }
  attribute potter, String {
    definition "Name of the potter"
  }
  attribute kiln, String {
    definition "Type of kiln used"
  }
}</body></sourcecode> </example>

<example id="_d11a8fce-2660-9dd9-1e6c-36e3b59a68f2"><sourcecode id="_6eccdc2c-5d39-a63e-c549-3fa5b8c45972" lang="lml"><body>class TemperatureWithUnit {
  attribute value, Float {
    definition "Temperature value"
  }
  attribute unit, String {
    definition "Unit of temperature"
  }
}</body></sourcecode> </example>

<p id="_99dc3d0a-1c0d-f24c-f693-19b58f39f04a">Class attributes can be restricted to a specific set of values using the<tt>values</tt> declaration.</p>

<example id="_e97509ea-c8bf-8a1f-0a3f-e715a2127b8e"><sourcecode id="_9557efdf-13d6-1c55-9905-2e5e6105e2b5" lang="lml"><body>class GlazeTechnique {
  attribute name, String {
    values { "Celadon", "Raku", "Majolica" }
  }
}</body></sourcecode>


<p id="_960a8797-9368-e047-37a1-e5049d8f316f">Or</p>

<sourcecode id="_817f3181-f975-aace-ee59-509b3491f229" lang="lml"><body>enum GlazeTechniqueEnum {
  value "Celadon"
  value "Raku"
  value "Majolica"
}
class GlazeTechnique {
  attribute name, String {
    values GlazeTechniqueEnum
  }
}</body></sourcecode>

</example>

<p id="_3a75da10-ed3c-05b1-6b74-7d1484ad7544">It is possible to also define values with model instances. See <xref target="instance_representation"/> for syntax to declare model instances.</p>

<example id="_8903168d-8fdb-574f-76b2-561eff3cd4d7"><p id="_2f58ed7c-83e8-1c62-5104-8ef425a8997f">Given this class:</p>

<sourcecode id="_b53abdb2-b5bd-eb3c-969b-87b1761fd9f7" lang="lml"><body>class Ceramic {
  attribute type, String {
    definition "Type of ceramic material"
  }
  attribute firing_temperature, Integer {
    definition "Temperature at which the ceramic is fired"
  }
}</body></sourcecode>


<p id="_75a8a430-0cc7-9a06-822c-8f2c93459507">The values can be defined as:</p>

<sourcecode id="_01f24560-ac7e-4621-faf9-a77b13ad1e95" lang="lml"><body>class CeramicCollection {
  attribute featured_piece, Ceramic {
    definition "Featured ceramic piece"

    values {
      instance Ceramic {
        type = "Porcelain"
        firing_temperature = 1300
        definition {
          Porcelain is a ceramic material made from kaolin clay.
        }
      }
      instance Ceramic {
        type = "Stoneware"
        firing_temperature = 1200

        definition {
          Stoneware is a durable ceramic that is fired at high temperatures.
        }
      }
      instance Ceramic {
        type = "Earthenware"
        firing_temperature = 1000
        definition {
          Earthenware is a porous ceramic that is fired at lower temperatures.
        }
      }
    }
  }
}</body></sourcecode>


<p id="_01743f94-f8e4-d197-aae3-42d5d96cc77b">Or</p>

<sourcecode id="_210da8e6-f8f8-64f1-998e-756b22046fb8" lang="lml"><body>class CeramicCollection {
  attribute featured_piece, Ceramic {
    definition "Featured ceramic piece"

    value {
      instance Ceramic {
        type = "Porcelain"
        firing_temperature = 1300
        definition {
          Porcelain is a ceramic material made from kaolin clay.
        }
      }
    }
    value {
      instance Ceramic {
        type = "Stoneware"
        firing_temperature = 1200

        definition {
          Stoneware is a durable ceramic that is fired at high temperatures.
        }
      }
    }
    value {
      instance Ceramic {
        type = "Earthenware"
        firing_temperature = 1000
        definition {
          Earthenware is a porous ceramic that is fired at lower temperatures.
        }
      }
    }
  }
}</body></sourcecode>

</example>

<p id="_24b6a055-6758-2518-f94c-ed082bee16b3">Within the block, the following declarations are available:</p>

<ul id="_80834f61-36ca-4133-7e41-4266f7c0310c"><li><p id="_b668864f-e98b-8bd3-368c-5e85d3160d4a"><tt>attribute</tt></p>
</li>
<li><p id="_ff1d1d77-7181-2139-f8df-dd2532642ae8"><tt>definition</tt></p>
</li>
<li><p id="_5dd15fc4-7472-9d9a-ac8c-499385b32ae8"><tt>values</tt> / <tt>value</tt></p>
</li>
</ul>
</clause>

<clause id="_attribute_2" obligation="normative">
<title>Attribute</title>
<p id="_8de15e62-b20e-1121-fee5-8997fcd69ca8">The <tt>attribute</tt> construct is used to define an attribute of a class.</p>

<p id="_8961edf3-a9b5-92b8-a0a0-717b1136731e">Syntax:</p>

<sourcecode id="_c4cbfe09-fe44-4148-5865-0acca845309c" lang="lml"><body>attribute {name}, {type} {block}</body></sourcecode>


<p id="_79b13c3b-65d2-4cef-2c5c-5dc424c42f0c">Where,</p>

<dl id="_00b05a86-0709-b099-4b50-228044e5f95e"><dt><tt>{name}</tt></dt>
<dd><p id="_12c51202-6e9e-0f3a-018e-d40d1df9662b">the name of the attribute</p>
</dd>
<dt><tt>{type}</tt></dt>
<dd><p id="_96ee3702-5a80-a411-7cfc-d0e88bcb6840">the type of the attribute</p>
</dd>
<dt><tt>{*block}</tt></dt>
<dd><p id="_53817ac5-355d-54b1-49bb-68d31ea50735">an optional block</p>
</dd>
</dl>

<example id="_f4f69d6a-4545-145f-8e4f-0b8aebe1b4d5"><sourcecode id="_ba489dc1-6105-34a7-ff7f-2c1ff9bba01d" lang="lml"><body>attribute location, String {
  definition "Location of the studio"
}</body></sourcecode> </example>

<example id="_e6f44435-84dc-19ea-3db4-dadc7c6288cb"><sourcecode id="_b585e763-1da7-06cf-ce5e-fd7aaefd5d87" lang="lml"><body>attribute dimensions, Float {
  definition "Dimensions of the ceramic piece"
}</body></sourcecode> </example>

<p id="_e341d788-b0e0-9968-d8ee-717c1b0709d1">An attribute can have a cardinality constraint when it is a collection.</p>

<p id="_ae4b1090-2542-7de6-1f80-8ded4d7a3a3e">Syntax:</p>

<sourcecode id="_3e579ede-99a6-4412-2f6d-e36aab9dfb32" lang="lml"><body>attribute {name}, {type} { cardinality {min}..{max} }</body></sourcecode>


<p id="_90d4caf4-4827-6758-b4c4-e6c07982d0be">Where,</p>

<dl id="_ccf1d71a-678b-a090-276d-6710f3dee0bd"><dt><tt>{min}</tt></dt>
<dd><p id="_7d68e7fc-bf10-2f67-349a-275de1a1df9f">the minimum number of values</p>
</dd>
<dt><tt>{max}</tt></dt>
<dd><p id="_69cb519f-d667-fec2-5189-1b10a2507d6d">the maximum number of values</p>
</dd>
</dl>

<example id="_598f46e6-a993-6e4b-ad7a-b24c9b86aec3"><sourcecode id="_54ae31ba-3e1f-1d5c-cd9c-34596d9c14bc" lang="lml"><body>attribute batch_ids, String { cardinality 0..n }</body></sourcecode> </example>

<p id="_c8242ec4-766d-da19-bc22-ec1ced6657fe">An attribute can have a values constraint.</p>

<p id="_fc48ba55-d409-341e-ecd3-6cc51277d5be">Syntax:</p>

<sourcecode id="_4d3cba8b-23e0-3c41-e6d4-38499b76c779" lang="lml"><body>attribute {name}, {type} { values {value1, value2, ...} }</body></sourcecode>


<p id="_df8b2a61-ced0-232f-91eb-aa7df4c3a9e7">Where,</p>

<dl id="_72207222-d133-cb63-cc48-fd9e8a467d7e"><dt><tt>{value1, value2, …​}</tt></dt>
<dd><p id="_3be735d7-0a33-2d0e-53f2-18dcb47f86bd">the values that the attribute can take, or an Enum.</p>
</dd>
</dl>

<example id="_b28807e4-d0d8-3193-a2ff-fb12cf0f2fe9"><sourcecode id="_741e0021-9354-9f5b-b353-f033294c9a9a" lang="lml"><body>attribute firing_profile, FiringProfile {
  values { "low", "medium", "high" }
}</body></sourcecode> </example>

<example id="_1c321330-0a6e-1906-91c3-870991ec5bba"><sourcecode id="_53eb7b27-45ea-95c4-5d46-e0b5980c9a64" lang="lml"><body>enum FiringProfileEnum {
  value "low"
  value "medium"
  value "high"
}
class FiringProfile {
  attribute firing_profile, FiringProfile {
    values FiringProfileEnum
  }
}</body></sourcecode> </example>

<p id="_b8e1220f-8ec2-b0cc-9e00-2fdf431fdac0">An attribute that accepts a string value accepts value validation using regular expressions.</p>

<p id="_ce1dfa4c-3e14-ee7c-05ed-d052151a9d66">Syntax:</p>

<sourcecode id="_111dde9d-867e-514a-ee84-f36239cabaac" lang="lml"><body>attribute {name}, String { pattern {regex} }</body></sourcecode>


<p id="_d3e72037-2fe4-354b-95d0-ba6cd9b881cb">Where,</p>

<dl id="_50e7b30b-75a5-bac6-ef6d-6e40e8f6a000"><dt><tt>{regex}</tt></dt>
<dd><p id="_0ffeba47-ab4f-3b7a-bcc3-1bec9d0ffb67">the regular expression to validate the string value</p>
</dd>
</dl>

<example id="_4d3a0a15-8e4e-216f-7ef0-465f98b8ac98"><p id="_2905334d-d227-4e24-227e-8a2faba174ff">In this example, the <tt>color</tt> attribute takes hex color values such as <tt>#ccddee</tt>.</p>

<p id="_2ab5f81f-a02b-8081-9c52-e017b8fead4d">A regular expression can be used to validate values assigned to the attribute. In this case, it is <tt>/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/</tt>.</p>

<sourcecode id="_f8683293-e35c-4efa-5536-2d2703345f16" lang="lml"><body>attribute color, String {
  pattern /\A#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})\z/
}</body></sourcecode>

</example>

<p id="_408b5411-9530-1cd0-55d9-9dc21c1f6317">An attribute can have a default value using the <tt>default</tt> option. The <tt>default</tt> option can be set to a value or a lambda that returns a value.</p>

<p id="_4e75a719-f424-630b-ab9b-33ae2e38d483">Syntax:</p>

<sourcecode id="_9799403b-771d-2f52-b4fe-7c54d1d18ccd" lang="lml"><body>attribute {name}, {type} { default: {value} }</body></sourcecode>


<example id="_fdb48a07-4fff-6eb2-f43f-8654cf360fba">
<name>Using the <tt>default</tt> option to set a default value for an attribute</name>
<sourcecode id="_b84f7c26-deff-a68d-f5ab-e75755751422" lang="lml"><body>class Glaze {
  attribute color, String { default: "Clear" }
  attribute temperature, Integer { default: 1050 }
}</body></sourcecode>

</example>

<p id="_769b2a55-c2f6-7a90-2782-693999c433f9">Within the block, the following declarations are available:</p>

<ul id="_67d02d54-7c83-09ce-610d-5b519a7a6790"><li><p id="_e76f9ba3-3e4b-f679-4943-f910c791a1be"><tt>definition</tt></p>
</li>
<li><p id="_969637fc-25bd-0123-c166-b8e264e18893"><tt>values</tt></p>
</li>
<li><p id="_a8e9d48a-6c9a-9dfb-8c4d-24f48f8843a5"><tt>cardinality</tt></p>
</li>
</ul>
</clause>

<clause id="_value" obligation="normative">
<title>Value</title>
<p id="_63b10cc1-d163-5e6a-6bdf-5ae33c1d3c8e">The <tt>value</tt> construct is used to define a value.</p>

<p id="_91b5a2f8-2242-5aa3-2aef-f9eea37cac73">Syntax:</p>

<sourcecode id="_af817ebf-4933-6270-96da-7e00a59ec117" lang="lml"><body>value {name} {block}</body></sourcecode>


<p id="_1ea0dfe8-2a65-696c-a712-f1894a7ed7a1">Where,</p>

<dl id="_38ad92f8-005c-96e2-6e65-9cb551e5cd84"><dt><tt>{name}</tt></dt>
<dd><p id="_309d8913-02ba-b9c7-048c-705b15cbc251">the name of the value</p>
</dd>
<dt><tt>{*block}</tt></dt>
<dd><p id="_60e4eb1b-9a1e-6f43-e596-3fe4eb7c795f">an optional block</p>
</dd>
</dl>

<example id="_daa21140-413a-1e4a-af62-624afe451192"><sourcecode id="_8b349712-3a8d-f2c0-73c8-22f2dcf2f5f8" lang="lml"><body>value "Porcelain" {
  definition "Ceramic material made from kaolin clay"
}</body></sourcecode> </example>
</clause>

<clause id="_enums" obligation="normative">
<title>Enums</title>
<p id="_a19dbcee-d517-972e-b397-e427dc20a225">An <tt>enum</tt> construct is used to defined a named collection of values. Objects inside an Enum may be primitive values or instances of objects.</p>

<p id="_3a88730d-fe1c-ce13-8a9a-5afdffd985bd">Syntax:</p>

<sourcecode id="_27876d2d-7e86-24f0-147c-6cc5b4096b20" lang="lml"><body>enum {name} { // enum block
  value {value-name} {value-block}
}</body></sourcecode>


<p id="_6c0f359c-b47f-73d6-8d14-0b81f95373ef">Where,</p>

<dl id="_f6ced6be-a05d-aaab-ec49-3bcbb70ec460"><dt><tt>{name}</tt></dt>
<dd><p id="_6e85fca5-bb43-2db2-19a5-4ba35872c142">the name of the enum</p>
</dd>
<dt><tt>{*block}</tt></dt>
<dd><p id="_14f6db09-e9a1-8a98-b38d-f9ea4d187b8b">an optional block</p>
</dd>
<dt><tt>{value-name}</tt></dt>
<dd><p id="_847120ce-02ea-ec7a-ce61-02877a83f7c6">the name of the value</p>
</dd>
<dt><tt>{*value-block}</tt></dt>
<dd><p id="_16352151-6e9a-02be-8966-2b61ac5c64f1">an optional block</p>
</dd>
</dl>

<example id="_54dc3f2d-1f61-48f4-26ef-d1de22a3b387"><sourcecode id="_55f2c0d1-b17e-cded-5492-23b669eec038" lang="lml"><body>enum GlazeTechnique {
  definition "Techniques for glazing ceramics"

  value "Celadon" {
    definition "Technique that creates glaze in a pale green color"
  }
  value "Raku" {
    definition "Technique that creates a crackled glaze"
  }
  value "Majolica" {
    definition "Technique that creates a white glaze"
  }
}</body></sourcecode> </example>

<example id="_9f836fe7-b296-f206-d4d6-9008a07e3442"><sourcecode id="_b10e7234-7a6f-036c-2f5a-6850c9e52640" lang="lml"><body>enum GlazeType {
  value "matte" { description "Non-reflective finish" }
  value "gloss" { description "Reflective finish" }
}</body></sourcecode> </example>

<p id="_24196661-16cc-f9b1-0305-9c5ce3538780">Enums accept instances as values as well.</p>

<example id="_3c46f345-d08e-ad30-5591-7ccd7a0c83f4"><sourcecode id="_3833c883-632b-c61d-ba02-ca71c5c9c84a" lang="lml"><body>class GlazeType {
  attribute name, String
  attribute description, String
}

enum GlazeTypes {
  definition "Types of glaze finishes"

  value "matte" {
    instance {
      name = "matte"
      definition = "Non-reflective finish"
    }
  }
  value "gloss" {
    instance {
      name = "gloss"
      definition = "Reflective finish"
    }
  }
}</body></sourcecode> </example>

<p id="_bdb197c5-b478-c116-16eb-c4a64c19397f">Within the block, the following declarations are available:</p>

<ul id="_321fccee-7bf7-076f-a0bc-d23a18585757"><li><p id="_28ea5c95-9c04-0ad9-f652-cd500cf5b9ad"><tt>value</tt></p>
</li>
<li><p id="_6424198c-417a-4f1d-99f0-81167eb90969"><tt>definition</tt></p>
</li>
</ul>
</clause>
</clause>

<clause id="_serialization_2" obligation="normative">
<title>Serialization</title>
<clause id="_general_6" obligation="normative">
<title>General</title>
<p id="_b88f24eb-2fd1-03d2-1056-9c6ef4f6a9e7">LutaML supports the following constructs for serialization.</p>
</clause>

<clause id="_xml" obligation="normative">
<title>XML</title>
<clause id="_general_7" obligation="normative">
<title>General</title>
<p id="_1063c608-443d-bd56-9b2a-d5cf499d39ab">LutaML supports the serialization of data models to XML.</p>

<p id="_8f940c43-6273-5365-7cb6-f43948ac7608">Syntax:</p>

<sourcecode id="_8cb6ec5b-7530-dd50-77b0-7ffc420218b0" lang="lml"><body>xml {block}</body></sourcecode>


<p id="_98f1887f-4ee7-b2e2-461b-8c5f57890b56">Where,</p>

<dl id="_cb58896a-bfb8-a0b8-f9d8-13833fda45b2"><dt><tt>{block}</tt></dt>
<dd><p id="_a4118bbd-178e-a0f0-00e2-34a74147c9fe">an XML block</p>
</dd>
</dl>

<example id="_7b448c94-db9c-f1d9-7a5f-e542c903717a"><sourcecode id="_0448eba9-ade4-e4b4-3d2a-2884e57d79a1" lang="lml"><body>class Studio {
  attribute location, String
  attribute potter, String
  attribute kiln, String

  xml {
    map_element "location" { attribute location }
    map_element "potter" { attribute potter }
    map_attribute "kiln" { attribute kiln }
  }
}</body></sourcecode>


<p id="_171dd873-ddc9-677e-9fa5-91045f7335d4">An instance of the class <tt>Studio</tt> will be serialized to XML as:</p>

<sourcecode id="_1a54e745-9d09-bfb4-aba8-aba46cd0c412" lang="xml"><body>&lt;studio&gt;
  &lt;location&gt;Paris&lt;/location&gt;
  &lt;potter&gt;Marie&lt;/potter&gt;
  &lt;kiln&gt;Electric&lt;/kiln&gt;
&lt;/studio&gt;</body></sourcecode>

</example>

<p id="_86ffc947-7f3b-1cf8-a727-c2994aa70c7b">Within the block, the following declarations are available:</p>

<ul id="_a6233b0c-0afd-fe49-88d3-6ad2c4ae4ca5"><li><p id="_1a98a688-5c02-715b-f774-fe96567ddebd"><tt>map_element</tt></p>
</li>
<li><p id="_9133968f-7c27-2e06-26f5-2168a6a97d7f"><tt>map_attribute</tt></p>
</li>
<li><p id="_211130a5-2561-84f6-b4e8-2df9edbe6ada"><tt>root</tt></p>
</li>
<li><p id="_c0c2f7d0-f434-66fd-45dd-4799ca3e25cd"><tt>no_root</tt></p>
</li>
</ul>
</clause>

<clause id="_setting_root_element_name" obligation="normative">
<title>Setting root element name</title>
<p id="_6884e1ff-fafa-ea96-ba8d-6233c29c8e20">By default, the root name is set to a lowercased version of the class name.</p>

<sourcecode id="_dd0ac108-e53f-545e-6bf9-88f118a67b1e" lang="lml"><body>xml {
  root "xml_element_name" <callout target="_69d089af-bd8a-4d0f-915c-92bbae2b722f">1</callout>
}</body><annotation id="_69d089af-bd8a-4d0f-915c-92bbae2b722f"><p id="_c4d856ab-2f52-862e-3809-313c5b43a042">The name of the root element.</p>
</annotation></sourcecode>



<example id="_7b5b0f0d-6d38-334b-e487-7bb046ea6c17"><sourcecode id="_4f14a002-3fc0-c6c3-92a0-f6b118d799bb" lang="lml"><body>class Studio {
  attribute location, String
  attribute potter, String
  attribute kiln, String

  xml {
    root "local-studios"
    map_element "location" { attribute location }
    map_element "potter" { attribute potter }
    map_attribute "kiln" { attribute kiln }
  }
}</body></sourcecode>


<p id="_4036fe2b-2858-9aed-c47d-46bc83c5e91f">An instance of the class <tt>Studio</tt> will be serialized to XML as:</p>

<sourcecode id="_57b4d638-8e0a-aeda-9ea9-01cf4575af3e" lang="xml"><body>&lt;local-studios&gt;
  &lt;location&gt;Paris&lt;/location&gt;
  &lt;potter&gt;Marie&lt;/potter&gt;
  &lt;kiln&gt;Electric&lt;/kiln&gt;
&lt;/local-studios&gt;</body></sourcecode>

</example>
</clause>

<clause id="_omitting_root_element" obligation="normative">
<title>Omitting root element</title>
<p id="_a33c871f-091f-b330-b960-9e6e40de4123">By default, there exists a root element in a model represented in XML. In cases where the root element is not to be present, it can be omitted.</p>

<p id="_3fafcb0d-0086-bf3c-a54d-29b809c8128d">Syntax:</p>

<sourcecode id="_fef89dbc-f2fb-5919-8423-3d5b97da7072" lang="lml"><body>xml {
  no_root
}</body></sourcecode>


<example id="_48529e6f-095a-4c2c-5869-1dae10b0539d"><sourcecode id="_e0f5efc1-44eb-7def-1c4b-e2607ea97414" lang="lml"><body>class Studio {
  attribute location, String
  attribute potter, String
  attribute kiln, String

  xml {
    no_root
    map_element "location" { attribute location }
    map_element "potter" { attribute potter }
    map_attribute "kiln" { attribute kiln }
  }
}</body></sourcecode>


<p id="_b4289d3b-c60e-a4e7-36f7-5099c4c67dfe">An instance of the class <tt>Studio</tt> will be serialized to XML as:</p>

<sourcecode id="_ce984559-4b0a-985a-2813-8755ed184a56" lang="xml"><body>&lt;location&gt;Paris&lt;/location&gt;
&lt;potter&gt;Marie&lt;/potter&gt;
&lt;kiln&gt;Electric&lt;/kiln&gt;</body></sourcecode>

</example>
</clause>

<clause id="_map_element" obligation="normative">
<title>map_element</title>
<p id="_85a10433-f502-2307-9c82-b648c67dac7c">The <tt>map_element</tt> construct is used to map an XML element to a model attribute.</p>

<p id="_bf7f6e26-5820-242c-2e73-3eedc36b85d8">Syntax:</p>

<sourcecode id="_ed53acd7-763f-cab0-654e-a31689d57132" lang="lml"><body>map_element {name} {block}</body></sourcecode>


<p id="_b9c90f5c-f8dd-7455-57a6-0d35af45a008">Where,</p>

<dl id="_09a0dedb-d644-f7bb-7369-581f2e9d6d61"><dt><tt>{name}</tt></dt>
<dd><p id="_5c26ad1a-ee81-7967-7823-ffdb675f2aba">the name of the element</p>
</dd>
<dt><tt>{*block}</tt></dt>
<dd><p id="_b0447187-1177-dd47-ea70-bcf045800330">an optional block</p>
</dd>
</dl>

<example id="_e953813d-22aa-39c5-1c42-da9b1a444457"><sourcecode id="_05614dac-5798-5ea9-cb8e-63b7c48151e9" lang="lml"><body>class Studio {
  attribute location, String

  xml {
    map_element "geo-location" { attribute location }
  }
}</body></sourcecode>  <sourcecode id="_35bea624-daf6-ae8b-09cf-3973b5648d22" lang="xml"><body>&lt;studio&gt;
  &lt;geo-location&gt;Paris&lt;/geo-location&gt;
&lt;/studio&gt;</body></sourcecode> </example>

<p id="_a5b07205-8b3f-63a0-c6f8-c472b901ff13">In <tt>map_element</tt>, if the target attribute is a LutaML model, the newly specified element name overrides the defined <tt>root</tt> name of the model.</p>

<example id="_76369511-0ff2-763e-5b9b-c07799670da5"><sourcecode id="_9c0b111e-ca47-5a9e-2ed3-75ca15992e95"><body>class LocationElement {
  attribute location, String

  xml do
    root "location"
    map_element "place" { attribute location }
  end
}

class Studio {
  attribute location, LocationElement

  xml {
    root "studio"
    map_element "geo" { attribute location }
  }
}</body></sourcecode>  <sourcecode id="_46ec3637-c7e5-a126-ed31-71c6356c5527" lang="xml"><body>&lt;studio&gt;
  &lt;geo&gt;&lt;place&gt;Paris&lt;/place&gt;&lt;/geo&gt;
&lt;/studio&gt;</body></sourcecode> </example>
</clause>

<clause id="_map_attribute" obligation="normative">
<title>map_attribute</title>
<p id="_73c57885-ca09-188c-6ad1-a228b2b88dc1">The <tt>map_attribute</tt> construct is used to map an XML attribute to a model attribute.</p>

<p id="_94cf1b2e-ae50-8e0a-ecff-a4b519b5aeee">Syntax:</p>

<sourcecode id="_6c7a582d-6ce8-6800-80fd-c3d30bb9b0a5" lang="lml"><body>map_attribute {name} {block}</body></sourcecode>


<p id="_e38d683a-080f-a3fa-a1d6-2e5098d3f49e">Where,</p>

<dl id="_dffac86c-f1f8-88c5-0236-12757ad687f9"><dt><tt>{name}</tt></dt>
<dd><p id="_ee44c7b9-814b-6c1c-152a-1ad7a42760fc">the name of the attribute</p>
</dd>
<dt><tt>{*block}</tt></dt>
<dd><p id="_0fb37867-7c1a-38db-110a-910274ee10dc">an optional block</p>
</dd>
</dl>

<example id="_c9769669-ac4b-86a3-4888-a90aeaf1fa3d"><sourcecode id="_8ad7555b-f5b6-83ca-974d-f2b632a04bc6" lang="lml"><body>class Studio {
  attribute location, String
  attribute identifier, String
  attribute kiln, String

  xml {
    map_element "geo-location" { attribute location }
    map_attribute "identifier" { attribute identifier }
    map_attribute "kiln" { attribute kiln }
  }
}</body></sourcecode>  <sourcecode id="_5f1ae648-5801-dc90-54bc-79733c086b20" lang="xml"><body>&lt;studio identifier="1234" klin="Electric"&gt;
  &lt;geo-location&gt;Paris&lt;/geo-location&gt;
&lt;/studio&gt;</body></sourcecode> </example>
</clause>

<clause id="_map_content" obligation="normative">
<title>map_content</title>
<p id="_934b6213-7b04-3f4f-b168-686ac2077095">The <tt>map_content</tt> construct is used to map the content of an XML element to a model attribute.</p>

<p id="_96d34d2c-b4f1-5945-942b-e77213a28f5a">Syntax:</p>

<sourcecode id="_04f0a62b-af75-5990-cb8a-35b62fb719ba" lang="lml"><body>map_content {block}</body></sourcecode>


<p id="_92b7ae0e-415c-0171-9763-671d39dac3ea">Where,</p>

<dl id="_76433322-aab3-be67-fcb5-4a9940f9a0e9"><dt><tt>{*block}</tt></dt>
<dd><p id="_f481d845-bbb0-1ec9-9325-6867412c0a5c">an optional block</p>
</dd>
</dl>

<example id="_0757b13f-80a9-f0c7-344f-d02bba42df44"><sourcecode id="_b8e2f0b0-dd5b-5e8e-f4a3-c52869e076d6" lang="lml"><body>class Studio {
  attribute location, String

  xml {
    map_content { attribute location }
  }
}</body></sourcecode>  <sourcecode id="_f77ff53b-e604-d9a4-5ba0-c201d8bf3cc3" lang="xml"><body>&lt;studio&gt;Paris&lt;/studio&gt;</body></sourcecode> </example>
</clause>

<clause id="_namespaces" obligation="normative">
<title>Namespaces</title>
<p id="_c791e156-7f23-ea38-3f34-dd6da7d6f48e">Namespaces can be defined in the XML serialization.</p>

<p id="_53639eac-bf00-0d20-5689-046012323a3d">The <tt>namespace</tt> construct is used to define a namespace in the element.</p>

<ul id="_35e80a13-c266-2006-e652-f0e7c02b87e3"><li><p id="_b790ad3b-c5f9-2559-58b5-26fae27d8e4c">In XML, this namespace declares the “default namespace” for all unnamespaced elements within this element.</p>
</li>
<li><p id="_d317e30a-578b-5e37-79cc-0f75a70e2545">Attributes are not affected by the namespace.</p>
</li>
<li><p id="_39484739-67a2-580e-f963-69b8b00f60ab">A namespace URI is optional, allowing for flexibility in definition.</p>
</li>
</ul>

<p id="_13418b72-ac7f-4bfa-7b37-f6141460e1a3">Syntax:</p>

<sourcecode id="_0042f142-f300-6c53-fab3-a3cbfbb729fd" lang="lml"><body>namespace {prefix} {uri}</body></sourcecode>


<p id="_0f5506f3-e00d-40de-1696-3411928f27d4">Where,</p>

<dl id="_1611ea37-4070-5f4b-b4ea-44cae2632448"><dt><tt>{prefix}</tt></dt>
<dd><p id="_5d4b9258-fb14-9a78-3dba-27599e9ba003">the namespace prefix</p>
</dd>
<dt><tt>{uri}</tt></dt>
<dd><p id="_29864d67-fbd1-03a6-878f-1e01e998c263">the namespace URI (optional)</p>
</dd>
</dl>

<example id="_9b566ebf-0464-55f2-5381-a97051cd237c"><sourcecode id="_bd868cbb-0764-c710-b1a1-dd4830a2981d" lang="lml"><body>class Studio {
  attribute location, String

  xml {
    namespace "geo" "http://example.com/geo"
    map_element "location" { attribute location }
  }
}</body></sourcecode>  <sourcecode id="_d036b8ea-468b-8ef6-c75f-be61067160c3" lang="xml"><body>&lt;studio xmlns:geo="http://example.com/geo"&gt;
  &lt;location&gt;Paris&lt;/location&gt;
&lt;/studio&gt;</body></sourcecode> </example>
</clause>
</clause>

<clause id="_key_value_formats" obligation="normative">
<title>Key-value formats</title>
<p id="_dfccff26-114a-5437-6286-81478ef2ba13">Key-value formats are serialization formats that represent data as a collection of key-value pairs.</p>

<p id="_232b1a7f-b3ad-050b-2ac6-043652dae70f"><bookmark id="_2470fa35-c387-1091-a80c-7ecca2793942"/>These include YAML, JSON, TOML and others.</p>


<clause id="_map" obligation="normative">
<title>map</title>
<p id="_d512d23c-c437-4d48-947c-eff9ab2fae58">The <tt>map</tt> construct is used to map a collection of elements to a model attribute.</p>

<p id="_7e092e47-6eb4-eee8-bc3f-8deaa899f222">Syntax:</p>

<sourcecode id="_0c931250-ce8a-de36-a877-219b27bcd380" lang="lml"><body>map {block}</body></sourcecode>


<p id="_f31061cc-1565-f6d2-fdcc-5a59ca20ee9c">Where,</p>

<dl id="_4aade910-9054-18ad-8f92-5f932b09af53"><dt><tt>{*block}</tt></dt>
<dd><p id="_7f57a020-c025-d911-3a1a-698bc562401d">an optional block</p>
</dd>
</dl>

<example id="_388093ce-892b-87b9-199e-fbe0d55ccc79"><sourcecode id="_be38bf4a-f6dd-4960-005c-b41589452ce6" lang="lml"><body>class Studio {
  attribute location, String

  yaml {
    map "location" { attribute location }
  }
}</body></sourcecode>  <sourcecode id="_c0029e8c-2cef-22e9-4aa6-e8e4e4a5ca11" lang="yaml"><body>- location: Paris
- location: Berlin
- location: London</body></sourcecode> </example>
</clause>
</clause>

<clause id="_collection_mappings" obligation="normative">
<title>Collection mappings</title>
<clause id="_map_key" obligation="normative">
<title>map_key</title>
<admonition id="_77171387-16da-4695-fc09-7f6799fa198b" type="warning"><p id="_19dfb952-031c-bdcc-25ec-c9693bc478dd">Only for key-value formats.</p>
</admonition>
<p id="_72c20455-1bf7-aff4-7d4c-b215698fb347">The <tt>map_key</tt> construct is used to map the key of a serialization object to a model attribute.</p>

<p id="_7ee805fd-1482-15de-26ed-bd36b6a574e9">Syntax:</p>

<sourcecode id="_0c015057-0621-325d-d16e-3cbf2de8e15f" lang="lml"><body>map_key {name} {block}</body></sourcecode>


<p id="_21626353-7c24-5dec-4157-e709b1a54deb">Where,</p>

<dl id="_f61930c2-0bb0-12ec-546d-715f3bc9d2c1"><dt><tt>{name}</tt></dt>
<dd><p id="_b95e36cd-42ee-829e-fbf2-930a404be94a">the name of the key</p>
</dd>
<dt><tt>{*block}</tt></dt>
<dd><p id="_7c645931-9ab9-42e4-9aff-a8652e90a849">an optional block</p>
</dd>
</dl>

<example id="_1da5776d-2c20-09bc-c172-5875d3d6dbfd"><sourcecode id="_a4435869-e9d9-d14c-4d46-5d0b8ec4ba43" lang="lml"><body>class Studio {
  attribute location, String
}

class StudioCollection &lt; Collection {
  instances Studio

  yaml {
    map_key "location" { attribute location }
  }
}</body></sourcecode>  <sourcecode id="_c12eec98-3de3-279c-bfbf-71db101d291e" lang="yaml"><body>- 01_paris: Paris
- 02_berlin: Berlin
- 03_london: London</body></sourcecode> </example>
</clause>

<clause id="_map_value" obligation="normative">
<title>map_value</title>
<admonition id="_49540e2d-8338-1cbc-9404-dc8b656ec000" type="warning"><p id="_751ec906-c5cd-a622-eaad-3e9d193cde0f">Only for key-value formats.</p>
</admonition>
<p id="_9917185a-e849-4776-e884-e1552417cc36">The <tt>map_value</tt> construct is used to map the value of a serialization object to a model attribute.</p>

<p id="_019aa483-7cc8-e2d9-0945-b4ef17e73f36">Syntax:</p>

<sourcecode id="_99688e08-ec33-5015-9d03-bf13aa19c09b" lang="lml"><body>map_value {name} {block}</body></sourcecode>


<p id="_f62f0497-bf55-7fa7-ec66-874aa5b5d4f7">Where,</p>

<dl id="_5bd23e90-3535-e379-e37f-7bead8fa8da8"><dt><tt>{name}</tt></dt>
<dd><p id="_e8ed5ceb-151f-d43b-2159-0737796497fd">the name of the value</p>
</dd>
<dt><tt>{*block}</tt></dt>
<dd><p id="_a6e72c2e-aefa-34c3-2bf0-e0d0ea6fc17b">an optional block</p>
</dd>
</dl>

<example id="_21c78f8f-60ef-4c9e-df7b-9d575bb742b8"><sourcecode id="_4f7af621-b51b-85e0-6ee6-bb1e1d22ba62" lang="lml"><body>class Studio {
  attribute location, String
}

class StudioCollection &lt; Collection {
  instances Studio

  yaml {
    map_key "location" { attribute location }
    map_value "location" { attribute location }
  }
}</body></sourcecode>  <sourcecode id="_6f5bb2ab-874e-c7a7-2706-f5f0287fe0ba" lang="yaml"><body>- 01_paris:
    location: Paris
- 02_berlin:
    location: Berlin
- 03_london:
    location: London</body></sourcecode> </example>
</clause>
</clause>
</clause>

<clause id="_instance_representation" obligation="normative">
<title>Instance representation</title>
<clause id="_instance_2" obligation="normative">
<title>Instance</title>
<p id="_e84a5661-631e-f76d-d34e-4a0e5f8ef2a2">An <tt>instance</tt> construct is used to define an instance of a class.</p>

<p id="_3cba2bde-1138-fca9-644b-ff66042d5256">To assign values to attributes, the attribute name is followed by an equal sign and the value.</p>

<p id="_045c3070-697d-54a7-b694-a4af2f902244">Syntax:</p>

<sourcecode id="_ec6dba49-0d06-59d4-5db4-0fca460bf714" lang="lml"><body>instance {name} {block}</body></sourcecode>


<p id="_44fccb00-564c-2935-dee5-2fa5aca96e54">Where,</p>

<dl id="_be0729f4-5c41-e747-bfcc-afd10c983a14"><dt><tt>{name}</tt></dt>
<dd><p id="_38dfa0e4-24b7-777a-b0de-98ada4217f1e">the name of the instance</p>
</dd>
<dt><tt>{*block}</tt></dt>
<dd><p id="_8db0d97d-5140-a581-428c-a7ab368bdb3d">an optional block</p>
</dd>
</dl>

<example id="_4b57a494-b271-367f-e205-395be492df71"><sourcecode id="_020f32ce-a57e-1e43-6f32-f6221e905cd7" lang="lml"><body>class Studio {
  attribute location, String
  attribute potter, String
  attribute kiln, String
}

instance "Studio" {
  location = "Paris"
  potter = "Marie"
  kiln = "Electric"
  definition {
    Marie's studio in Paris.
  }
}</body></sourcecode> </example>

<example id="_d96884f2-37a1-ff36-8312-45a06e528c50"><sourcecode id="_8d6462af-1791-2eac-20e8-7ee371f7bb6c" lang="lml"><body>class CeramicTile {
  attribute dimensions, Float { cardinality 2 }
  attribute firing_profile, FiringProfile
  definition {
    Types of ceramic tiles.
  }
}

instance "square" CeramicTile {
  dimensions = [30.5, 30.5]
  firing_profile = "high"

  definition {
    A square ceramic tile used for various applications.
  }
}</body></sourcecode> </example>

<p id="_b76e7904-239e-8421-7208-b45e2658da6b">Within the block, the following declarations are available:</p>

<ul id="_4edb770f-a4d7-1096-96ac-31153e72015a"><li><p id="_9b80f0b6-3873-e354-4884-25b872128370">attributes of the class</p>
</li>
<li><p id="_f22e5022-b4f9-b8d6-fd67-d37e7edcea2a"><tt>definition</tt></p>
</li>
<li><p id="_8b510004-0ad9-bd23-6c21-ae68a60978ff"><tt>values</tt></p>
</li>
</ul>
</clause>

<clause id="_instance_collection" obligation="normative">
<title>Instance collection</title>
<p id="_6d927107-63b8-913f-bc1c-03a648e4e637">Instances are representations of classes with values assigned to their attributes as a collection.</p>

<p id="_804213f9-79d5-2133-7594-54af092de56b">Syntax:</p>

<sourcecode id="_efde4084-b2c5-2145-cf26-fbb197bc23c5" lang="lml"><body>instances {name} {block}</body></sourcecode>


<p id="_c8c40be8-44f5-8597-ebe2-1b972ac7eeec">Where,</p>

<dl id="_d01cc083-1d55-efb9-d407-f6e2ccb93ba7"><dt><tt>{name}</tt></dt>
<dd><p id="_901d9534-6297-1426-1372-95fa2552f7bd">the name of the instance</p>
</dd>
<dt><tt>{*block}</tt></dt>
<dd><p id="_a69fb8d1-7f51-a195-2f9d-f853491ae03a">an optional block</p>
</dd>
</dl>

<example id="_4ca44170-f8ed-eff0-cb7f-5b1b63317801"><sourcecode id="_1c5b1d48-ab9f-ce62-c44d-b0ef701e0b70" lang="lml"><body>instances "Studios" {
  instance Studio {
    location = "Paris"
    potter = "Marie"
    kiln = "Electric"
  }

  instance Studio {
    location = "Berlin"
    potter = "Hans"
    kiln = "Gas"
  }
}</body></sourcecode> </example>

<example id="_3d7fcc95-44ac-457b-e9ea-5900591b93da"><sourcecode id="_ac3da18e-05e3-62d4-121b-fb5557060730" lang="lml"><body>instances "Tiles" {
  instance "square" CeramicTile {
    dimensions = [30.5, 30.5]
    firing_profile = "high"
  }

  instance "circle" CeramicTile {
    dimensions = [20.5, 20.5]
    firing_profile = "medium"
  }
}</body></sourcecode> </example>

<p id="_b44b8dd4-ffa3-f4f6-11ca-06ccdd8f4898">Within the block, the following declarations are available:</p>

<ul id="_fa53ba95-04a1-39be-2c5d-25e7d64e78a1"><li><p id="_6b66b5c7-25e0-4c82-7bce-2c53d6d4e604"><tt>instance</tt></p>
</li>
</ul>
</clause>

<clause id="_value_type" obligation="normative">
<title>Value type</title>
<clause id="_references" obligation="normative">
<title>References</title>
<p id="_f92f7572-c408-edae-0fe7-e7d2e5a82814">References are used to link instances together.</p>

<p id="_b793eff3-4a9f-1562-75ea-dfa9c5c22d53">Syntax:</p>

<sourcecode id="_ae215c46-9b1d-9a68-99c9-e692a2b3d902" lang="lml"><body>ref:(path)</body></sourcecode>


<p id="_4ca747e1-d9a0-c2bb-9525-5023de86147c">Where,</p>

<dl id="_acc6c968-bdf7-6271-43ce-d0f812fa9489"><dt><tt>{path}</tt></dt>
<dd><p id="_4ebf3460-d7bf-c142-c304-c7554336e88e">the path to the instance</p>
</dd>
</dl>

<example id="_33c82844-a7e1-cf3d-e4c6-1d87a5c41615"><sourcecode id="_628f397f-ccef-2138-60d3-979df4aeaa6e" lang="lml"><body>instances Glazes {
  GlazeFormula "blue_matte" {
    components = ["silica", "cobalt"]
  }

  CeramicTile "tile_002" {
    glaze = ref:(Glazes.blue_matte)
  }
}</body></sourcecode> </example>
</clause>
</clause>
</clause>

<clause id="_reuse_and_referencing" obligation="normative">
<title>Reuse and referencing</title>
<p id="_56cb7d89-a3e1-0c0b-01c8-b6da37f6eeac">Lutaml supports modularity through external file inclusions.</p>

<clause id="_external_file_inclusion" obligation="normative">
<title>External file inclusion</title>
<p id="_91d8cd82-6a6f-a629-bdea-83ae9c3235b9">Use <tt>require</tt> to import definitions from other files.</p>

<sourcecode id="_7d57d56f-49a2-1eb7-2d0f-5e683157ddfa" lang="lml"><body>require "materials.lml"
instances Tiles {
  Materials::CeramicTile "tile_001" {
    dimensions = [30.0, 30.0]
    firing_profile = "medium"
  }

  Materials::CeramicTile "tile_002" {
    dimensions = [40.0, 60.0]
    firing_profile = "high"
  }
}</body></sourcecode>

</clause>

<clause id="_internal_references" obligation="normative">
<title>Internal references</title>
<p id="_8b1fe7ca-397a-9904-0ced-84f733a53038">Link instances using <tt>ref:</tt>.</p>

<sourcecode id="_7b0a4c4b-91d0-31c2-bea7-bc6619bffd0f" lang="lml"><body>instances Production {
  GlazeFormula "gloss_blue" { ... }

  CeramicTile "tile_001" {
    glaze = ref:(GlazeFormula.gloss_blue)
  }
}</body></sourcecode>

</clause>

<clause id="_namespacing" obligation="normative">
<title>Namespacing</title>
<p id="_0a35bccb-15a4-693d-383d-69a3af6ae5cd">Class names are scoped to their model (e.g., <tt>Materials::CeramicTile</tt>).</p>
</clause>
</clause>

<clause id="_validation_rules" obligation="normative">
<title>Validation rules</title>
<clause id="_attribute_constraints" obligation="normative">
<title>Attribute constraints</title>
<ol id="_39d24c7f-eb94-cbe0-6a8e-4c3a1e060597" type="arabic"><li><p id="_ea01d230-1129-0e52-8369-1e73304e8c69">Mandatory fields (<tt>cardinality 1</tt>) must be populated.</p>
</li>
<li><p id="_92dad977-0504-244d-c853-ee1074311db7">Values must match the declared type (e.g., <tt>float</tt> for <tt>thickness</tt>).</p>
</li>
</ol>
</clause>

<clause id="_class_constraints" obligation="normative">
<title>Class constraints</title>
<ol id="_cef822b6-e218-fc3a-fec2-29d12d40742d" type="arabic"><li><p id="_6c776d28-c400-e4fb-8ecd-2142a665d661">Unique names within a model.</p>
</li>
<li><p id="_f0b61021-3d82-6a03-8c23-dcf431f3d6a8">Attribute names unique within a class.</p>
</li>
</ol>
</clause>

<clause id="_reference_validity" obligation="normative">
<title>Reference validity</title>
<ul id="_796b6f6b-1b15-beed-4ee4-c7b0a3243530"><li><p id="_167b9d2d-b42e-f248-167f-2c3713fb7c49"><tt>ref:</tt> must resolve to a valid instance path.</p>
</li>
<li><p id="_6c998757-f1ee-6e02-27e8-f4055ac3c81c">Circular references are invalid.</p>
</li>
</ul>
</clause>
</clause>

<clause id="_examples" obligation="normative">
<title>Examples</title>
<clause id="_ceramic_product_definition" obligation="normative">
<title>Ceramic product definition</title>
<sourcecode id="_28a23a8a-7e96-d12f-92d5-e508b84e49f2" lang="lml"><body>models Ceramics {
  enum FiringProfile { values { "low", "medium", "high" } }

  class CeramicTile {
    attribute dimensions, float { cardinality 2 }  // [length, width]
    attribute firing_profile, FiringProfile
  }
}

instances Tiles {
  Ceramics::CeramicTile "tile_001" {
    dimensions = [30.5, 30.5]
    firing_profile = "high"
  }
}</body></sourcecode>

</clause>

<clause id="_glaze_formula_reference" obligation="normative">
<title>Glaze formula reference</title>
<sourcecode id="_5a97f485-2bcb-fed9-1580-d3077b4c6a4f" lang="lml"><body>instances Glazes {
  GlazeFormula "blue_matte" {
    components = ["silica", "cobalt"]
  }

  CeramicTile "tile_002" {
    glaze = ref:(Glazes.blue_matte)
  }
}</body></sourcecode>

</clause>
</clause>
</sections><bibliography><references id="_normative_references" normative="true" obligation="informative">
<title>Normative references</title><p id="_cf4fafa1-7328-7d25-f309-bb194339feef">There are no normative references in this document.</p>

</references></bibliography>
<review-container><review id="_2113fff3-4e57-7b8e-bdb5-6b0914e91fa6" reviewer="(Unknown)" date="2025-05-09T00:00:00Z" type="todo" from="_2470fa35-c387-1091-a80c-7ecca2793942" to="_2470fa35-c387-1091-a80c-7ecca2793942"><p id="_3aa7776e-8fff-b38f-8d57-f79453433b71">General behavior</p>
</review></review-container></metanorma>
