XRX/Glossary Term Editor
Motivation
editYou want a tool to manage your organization-specific business terms including definitions, acronyms, synonyms, broader/narrower terms, see-also terms, definition sources, approval history, versions, and traceability and mappings to ISO/IEC 11179 data elements.
Method
editCreate a tool that manages individual business terms using a vocabulary similar to the W3C Simple Knowledge Organization SKOS draft standard. Use one XML file in an eXist collection for each term and have the server assign an ID number as each term is created. Allow each term to belong to one synonym set. We will associate each term with broader terms and use XQuery reports to infer narrower terms.
Design Steps
editTo build the glossary we can create an XML Schema for each term and generate an XForms application to manage the Term data. We can then hand-edit the generated form to add specific functionality.
New Instance File
edit<Term>
<id/>
<TermName/>
<Acronym/>
<SynonymID/>
<Definition/>
<SeeAlso/>
<Broader/>
<PrimarySourceCode/>
<PrimarySourceOtherText/>
<Approvals>
<ApprovalStatusCode/>
<AssignedToCode/>
<ApprovedByCode/>
<ApprovalDate/>
</Approvals>
<GroupStarredItemIndicator/>
<ProjectCode/>
<ClassifierCode/>
<Tag/>
<TermNoteText/>
<DataElement>
<DataElementIndicator/>
<DataElementDerivedIndicator/>
<DataElementDerivationRuleText/>
<DataElementIdentifierIndicator/>
<DataElementEnumerationsText/>
<DataElementValidationRulesText/>
<DataElementName/>
</DataElement>
</Term>
Term XML Schema File
edit<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="Term">
<xs:annotation>
<xs:documentation>A single business term in organization specific business glossary. v0.06</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element name="id">
<xs:annotation>
<xs:documentation>The term identifier. Usually a small integer assigned upon creation.</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="TermName" type="xs:string">
<xs:annotation>
<xs:documentation>The name of a term in the glossary.</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="Acronym" minOccurs="0">
<xs:annotation>
<xs:documentation>Optional acronym or abbreviation if used for the term.</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="SynonymID" minOccurs="0">
<xs:annotation>
<xs:documentation>A pointer to a synonym set. Each synonym set contains a list of approximately equivalent terms and one of those terms is a preferred term.</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="Definition">
<xs:annotation>
<xs:documentation>A short, precise, non-circular (you cannot say a widget is a widget) definition for this term that clearly differentiates this term from other terms.</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="1000"/>
<xs:minLength value="5"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="SeeAlso" type="xs:string" minOccurs="0" maxOccurs="unbounded">
<xs:annotation>
<xs:documentation>Other terms related to this term other that synonyms. May be hyperlinked.</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="Broader" minOccurs="0">
<xs:annotation>
<xs:documentation>A concept that is more general in meaning.</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="PrimarySourceCode" type="PrimarySourceCodeType" minOccurs="0">
<xs:annotation>
<xs:documentation>The primary source of the definition.</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="PrimarySourceOtherText" minOccurs="0">
<xs:annotation>
<xs:documentation>A text description of the primary source if it is not in one of the PrimarySourceCode. You must have a other text if PrimarySourceCode is 'other'</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="Approvals" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:element name="ApprovalStatusCode" minOccurs="0">
<xs:annotation>
<xs:documentation>An approval status such as draft, assigned to review team or approved.</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="initial-draft"/>
<xs:enumeration value="assigned-to-review-team"/>
<xs:enumeration value="project-approved"/>
<xs:enumeration value="obsolete"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="AssignedToCode" minOccurs="0">
<xs:annotation>
<xs:documentation>The person (BA) that this term is assigned to faciliatate approval. A code table is used to select the person's name.</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="Alice"/>
<xs:enumeration value="Ann"/>
<xs:enumeration value="Bob"/>
<xs:enumeration value="John"/>
<xs:enumeration value="Fred"/>
<xs:enumeration value="Peg"/>
<xs:enumeration value="Sue"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="ApprovedByCode" minOccurs="0">
<xs:annotation>
<xs:documentation>Name of the person in the business unit that approved this data element.</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="250"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="ApprovalDate" type="xs:date" minOccurs="0">
<xs:annotation>
<xs:documentation>The date the data element was approved.</xs:documentation>
</xs:annotation>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="GroupStarredItemIndicator" minOccurs="0">
<xs:annotation>
<xs:documentation>An indication that this item is of interest to a specific user.</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="ProjectCode" minOccurs="0" maxOccurs="unbounded">
<xs:annotation>
<xs:documentation>The projects that this term is associated with.</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="ClassifierCode" minOccurs="0" maxOccurs="unbounded">
<xs:annotation>
<xs:documentation>A code used to filter data elements. The user interface is a selection list that reads an external code table of filters.</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="Adjust"/>
<xs:enumeration value="Entity"/>
<xs:enumeration value="IRS"/>
<xs:enumeration value="Legal"/>
<xs:enumeration value="MM"/>
<xs:enumeration value="Process"/>
<xs:enumeration value="Product"/>
<xs:enumeration value="Program-Project"/>
<xs:enumeration value="System"/>
<xs:enumeration value="Technical"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="Tag" minOccurs="0" maxOccurs="unbounded">
<xs:annotation>
<xs:documentation>A keyword associated with this term.</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="TermNoteText" type="xs:string" minOccurs="0">
<xs:annotation>
<xs:documentation>Any additional notes about this term. Keep your definitions short by using this text area.</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="DataElement">
<xs:complexType>
<xs:sequence>
<xs:element name="DataElementIndicator">
<xs:annotation>
<xs:documentation>Set to true if this is a formal data elment that should be registered by the metadata registry.</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="DataElementDerivedIndicator" minOccurs="0">
<xs:annotation>
<xs:documentation>An indication that the element is derived from other data elements.</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="DataElementDerivationRuleText" minOccurs="0">
<xs:annotation>
<xs:documentation>A textual description of the rule to derive this data element. Use names of other data elements if possible. This field is required if the DataElementDerivedIndicator is true.</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="DataElementIdentifierIndicator" minOccurs="0">
<xs:annotation>
<xs:documentation>An indication that this data element identifies an instance within an indetification scheme.</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="DataElementEnumerationsText" minOccurs="0">
<xs:annotation>
<xs:documentation>A textual description of all the data element enumerations including codes, ranges and definitions with distinction definitions for each code and range of codes.</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="DataElementValidationRulesText" minOccurs="0">
<xs:annotation>
<xs:documentation>A textual description of any validation rules used to check this data element.</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="DataElementName" minOccurs="0" maxOccurs="unbounded">
<xs:annotation>
<xs:documentation>The ISO name (namespace prefix, ObjectPropertyTerm) of a data element in a metadata registry.</xs:documentation>
</xs:annotation>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="DataElementType">
<xs:sequence/>
</xs:complexType>
<xs:simpleType name="PrimarySourceCodeType">
<xs:restriction base="xs:string">
<xs:enumeration value="enterprise-glossary"/>
<xs:enumeration value="sales-glossary"/>
<xs:enumeration value="hr-glossary"/>
<xs:enumeration value="other"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>
XForms Application
editThis is an XQuery that when run with a parameters of new=true or an id=123 will generate an XForms application. It will need to be in the same folder as a new-instance.xml and it will need a save.xq and an update.xq to do the work of saving new instances (with the ids assigned) and updating existing instances, respectively. The update.xq will be responsible for versioning and archiving old values. The update script can also be responsible for creating log files of who changed what files and when.
Note: I have not fixed this yet to use the new pathnames for the Approval and DataElement containers.
xquery version "1.0";
declare namespace exist = "http://exist.sourceforge.net/NS/exist";
declare namespace system="http://exist-db.org/xquery/system";
declare namespace request="http://exist-db.org/xquery/request";
import module namespace cms = "http://cms.metadata.dmccreary.com" at "/db/mdr/cms/cms-module.xq";
declare option exist:serialize "method=xhtml media-type=text/xml indent=yes";
let $new := request:get-parameter('new', '')
let $id := request:get-parameter('id', '')
let $form := 'Glossary Editor'
let $form-version := '0.08'
return
(: check for required parameters :)
if (not($new or $id))
then (
<error>
<message>Parameter "new" and "id" are both missing. One of these two arguments is required for this web service.</message>
</error>)
else (
let $server-port := substring-before(request:get-url(), '/exist/rest/db/')
let $collection := '/db/mdr/glossaries/data/pace/'
(: put in the appropriate file name :)
let $file := if ($new)
then ('new-instance.xml')
else ( concat( $server-port, '/exist/rest/', $collection, $id, '.xml'))
return
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:xf="http://www.w3.org/2002/xforms"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:ev="http://www.w3.org/2001/xml-events" >
<head>
<title>{$form}</title>
{cms:import-css()}
<link rel="stylesheet" type="text/css" href="../../resources/css/xforms-global.css"/>
<link rel="stylesheet" type="text/css" href="../../resources/css/xrx-xforms.css"/>
<link rel="stylesheet" type="text/css" href="local-xform.css"/>
<xf:model>
<xf:instance xmlns="" id="my-term" src="{$file}"/>
<xf:bind nodeset="instance('my-term')/TermName" required="true()"/>
<xf:bind nodeset="instance('my-term')/Definition" required="true()"/>
<xf:bind nodeset="instance('my-term')/ApprovalDate" type="xs:date"/>
<!-- these do not work since the form will not submit with a null date -->
<xf:bind nodeset="instance('my-term')/ApprovalDate" required="false()" nillable="true()"/>
<xf:bind nodeset="instance('my-term')/GroupStarredItemIndicator" type="xs:boolean"/>
<xf:bind nodeset="instance('my-term')/DataElement/DataElementIndicator" type="xs:boolean"/>
<xf:bind nodeset="instance('my-term')/DataElement/DataElementIdentifierIndicator" type="xs:boolean"/>
<xf:bind nodeset="instance('my-term')/DataElement/DataElementDerivedIndicator" type="xs:boolean"/>
<xf:bind nodeset="instance('my-term')/GroupStarredItemIndicator" required="false()"/>
<!-- these are used to bind to conditional views or triggers-->
<xf:instance xmlns="" id="views">
<data>
<approved/>
<synonym-delete-trigger/>
<see-also-delete-trigger/>
<broader-delete-trigger/>
<narrower-delete-trigger/>
<tag-delete-trigger/>
<other-source/>
<data-element/>
<data-element-derived/>
</data>
</xf:instance>
<!-- only display the delete triggers if there is more than one item on the list -->
<xf:bind nodeset="instance('my-term')/PreferredTermIndicator" type="xs:boolean"/>
<xf:bind id="approved" nodeset="instance('views')/approved" relevant="instance('my-term')/ApprovalStatusCode='program-approved'"/>
<xf:bind id="synonym-delete-trigger" nodeset="instance('views')/synonym-delete-trigger" relevant="count(instance('my-term')/Synonym) > 1"/>
<xf:bind id="see-also-delete-trigger" nodeset="instance('views')/see-also-delete-trigger" relevant="count(instance('my-term')/SeeAlso) > 1"/>
<xf:bind id="broader-delete-trigger" nodeset="instance('views')/broader-delete-trigger" relevant="count(instance('my-term')/Broader) > 1"/>
<xf:bind id="narrower-delete-trigger" nodeset="instance('views')/narrower-delete-trigger" relevant="count(instance('my-term')/Narrower) > 1"/>
<xf:bind id="tag-delete-trigger" nodeset="instance('views')/tag-delete-trigger" relevant="count(instance('my-term')/tag) > 1"/>
<xf:bind id="other-source" nodeset="instance('views')/other-source" relevant="instance('my-term')/PrimarySourceCode='other' "/>
<xf:bind id="data-element" nodeset="instance('views')/data-element" relevant="instance('my-term')/DataElementIndicator='true' "/>
<xf:bind id="data-element-derived" nodeset="instance('views')/data-element-derived" relevant="instance('my-term')/DataElementDerivedIndicator='true' "/>
{if ($new='true')
then
<xf:bind nodeset="instance('my-term')/ApprovalDate" calculate="substring(now(), 1, 10)"/>
else ()}
<!-- code tables -->
<xf:instance xmlns="" id="code-tables" src="code-tables.xq"/>
<xf:submission id="save" method="post" action="{if ($new='true') then ('save-new.xq') else ('update.xq')}" instance="my-term" replace="all"/>
<xf:submission id="echo-test" method="post" action="{$server-port}/exist/rest/db/mdr/xqueries/echo-test.xq" instance="my-term" replace="all"/>
</xf:model>
</head>
<body>
{cms:header()}
<a class="breadcrumb" href="../../index.xhtml">Metadata Registry</a> >
<a class="breadcrumb" href="../index.xhtml">Glossary Manager</a>
<h1>{if ($new='true') then ('Create New') else ('Update')} Project Glossary Term</h1>
<p>{$form} - {$form-version} - File: {$file}</p>
<xf:group ref="instance('my-term')">
<xf:label class="group-label">Glossary Term</xf:label>
<xf:input ref="TermName" class="TermName">
<xf:label>Term Name:</xf:label>
<xf:hint>The name of a term in the glossary.</xf:hint>
</xf:input>
<xf:input ref="Acronym">
<xf:label>Acronym:</xf:label>
<xf:hint>The acronym or abbreviation for this term.</xf:hint>
</xf:input>
<xf:input ref="SynonymID">
<xf:label>Synonym Set ID:</xf:label>
<xf:hint>A link to the Synonym Set Editor.</xf:hint>
</xf:input>
<xf:textarea class="Definition" ref="Definition">
<xf:label>Definition:</xf:label>
<xf:hint>A short, precise, non-circular definition for this term that clearly differentiates this term
from other terms.</xf:hint>
</xf:textarea>
<xf:group>
<xf:label class="group-label">See Also</xf:label>
<xf:repeat id="see-also-repeat" nodeset="instance('my-term')/SeeAlso">
<xf:input ref="." class="SeeAlso inline-delete" id="see-also-input">
<xf:label>See Also (non-synonym):</xf:label>
<xf:hint>A related term in the glossary that is not a synonym.</xf:hint>
</xf:input>
<xf:trigger bind="see-also-delete-trigger" class="inline-delete">
<xf:label>Delete See Also</xf:label>
<xf:delete nodeset="instance('my-term')/SeeAlso[index('see-also-repeat')]" ev:event="DOMActivate"/>
</xf:trigger>
</xf:repeat>
<xf:trigger>
<xf:label>Insert New "See Also" Term</xf:label>
<xf:action ev:event="DOMActivate">
<xf:insert nodeset="instance('my-term')/SeeAlso" at="last()" position="after"/>
<xf:setvalue ref="instance('my-term')/SeeAlso[index('see-also-repeat')]" value=""/>
<xf:setfocus control="see-also-input"/>
</xf:action>
</xf:trigger>
</xf:group>
<xf:input ref="instance('my-term')/Broader">
<xf:label>Broader Term:</xf:label>
<xf:hint>A term that is more general in meaning.</xf:hint>
</xf:input>
<xf:group>
<xf:label class="group-label">Definition Sources</xf:label>
<xf:repeat id="source-repeat" nodeset="instance('my-term')/PrimarySourceCode">
<xf:select1 ref="." class="inline-delete" id="source-select">
<xf:label>Definition Source:</xf:label>
<xf:hint>The source of information about the term and its defintion.</xf:hint>
<xf:itemset nodeset="instance('code-tables')/CodeTable[CodeTableName='SourceCode']/item">
<xf:label ref="label"/>
<xf:value ref="value"/>
</xf:itemset>
</xf:select1>
<xf:trigger bind="tag-delete-trigger" class="inline-delete">
<xf:label>Delete Source</xf:label>
<xf:delete nodeset="instance('my-term')/PrimarySourceCode[index('source-repeat')]" ev:event="DOMActivate"/>
</xf:trigger>
</xf:repeat>
<xf:trigger>
<xf:label>Add New Source</xf:label>
<xf:action ev:event="DOMActivate">
<xf:insert nodeset="instance('my-term')/PrimarySourceCode" at="last()" position="after"/>
<xf:setvalue ref="instance('my-term')/PrimarySourceCode[index('source-repeat')]" value=""/>
<xf:setfocus control="source-select"/>
</xf:action>
</xf:trigger>
</xf:group>
<!-- bind="other-source" -->
<xf:group ref="instance('views')/other-source">
<xf:input ref="instance('my-term')/PrimarySourceOtherText">
<xf:label>Other Source: </xf:label>
</xf:input>
</xf:group>
<xf:group>
<xf:label class="group-label">Projects</xf:label>
<xf:repeat id="project-repeat" nodeset="instance('my-term')/ProjectCode">
<xf:select1 ref="." class="inline-delete" id="project-select">
<xf:label>Project:</xf:label>
<xf:hint>A code for classifying all the data elements.</xf:hint>
<xf:itemset nodeset="instance('code-tables')/CodeTable[CodeTableName='ProjectCode']/item">
<xf:label ref="label"/>
<xf:value ref="value"/>
</xf:itemset>
</xf:select1>
<xf:trigger bind="tag-delete-trigger" class="inline-delete">
<xf:label>Delete Project</xf:label>
<xf:delete nodeset="instance('my-term')/ProjectCode[index('project-repeat')]" ev:event="DOMActivate"/>
</xf:trigger>
</xf:repeat>
<xf:trigger>
<xf:label>Add New Project</xf:label>
<xf:action ev:event="DOMActivate">
<xf:insert nodeset="instance('my-term')/ProjectCode" at="last()" position="after"/>
<xf:setvalue ref="instance('my-term')/ProjectCode[index('project-repeat')]" value=""/>
<xf:setfocus control="project-select"/>
</xf:action>
</xf:trigger>
</xf:group>
<xf:select1 ref="instance('my-term')/AssignedToCode">
<xf:label>Assigned to Facilitate Approval:</xf:label>
<xf:itemset nodeset="instance('code-tables')/CodeTable[CodeTableName='AssignedToCode']/item">
<xf:label ref="label"/>
<xf:value ref="value"/>
</xf:itemset>
</xf:select1>
<xf:select1 ref="instance('my-term')/ApprovalStatusCode">
<xf:label>Approval Status:</xf:label>
<xf:item>
<xf:label>Initial Draft</xf:label>
<xf:value>initial-draft</xf:value>
</xf:item>
<xf:item>
<xf:label>Assigned for Review</xf:label>
<xf:value>assigned-to-review-team</xf:value>
</xf:item>
<xf:item>
<xf:label>Program Approved</xf:label>
<xf:value>program-approved</xf:value>
</xf:item>
</xf:select1>
<xf:group ref="instance('views')/approved">
<xf:select1 ref="instance('my-term')/ApprovedByCode">
<xf:label>Approved By:</xf:label>
<xf:hint>The person or organization that approved this term.</xf:hint>
<xf:itemset nodeset="instance('code-tables')/CodeTable[CodeTableName='ApprovedByCode']/item">
<xf:label ref="label"/>
<xf:value ref="value"/>
</xf:itemset>
</xf:select1>
<xf:input ref="instance('my-term')/ApprovalDate">
<xf:label>Approval Date:</xf:label>
<xf:hint>The date that this term was approved.</xf:hint>
</xf:input>
</xf:group>
<xf:input ref="instance('my-term')/GroupStarredItemIndicator">
<xf:label>Starred Item:</xf:label>
<xf:hint>An indication by the group that this item needs attention.</xf:hint>
</xf:input>
<xf:group>
<xf:label class="group-label">Classifiers</xf:label>
<xf:repeat id="classifier-repeat" nodeset="instance('my-term')/ClassifierCode">
<xf:select1 ref="." class="inline-delete" id="classifier-select">
<xf:label>Classifier (Filter) Code:</xf:label>
<xf:hint>A code for classifying all the data elements.</xf:hint>
<xf:itemset nodeset="instance('code-tables')/CodeTable[CodeTableName='ClassifierCode']/item">
<xf:label ref="label"/>
<xf:value ref="value"/>
</xf:itemset>
</xf:select1>
<xf:trigger bind="tag-delete-trigger" class="inline-delete">
<xf:label>Delete Classifier (Filter)</xf:label>
<xf:delete nodeset="instance('my-term')/ClassifierCode[index('classifier-repeat')]" ev:event="DOMActivate"/>
</xf:trigger>
</xf:repeat>
<xf:trigger>
<xf:label>Add New Classifier (Filter)</xf:label>
<xf:action ev:event="DOMActivate">
<xf:insert nodeset="instance('my-term')/ClassifierCode" at="last()" position="after"/>
<xf:setvalue ref="instance('my-term')/ClassifierCode[index('classifier-repeat')]" value=""/>
<xf:setfocus control="classifier-select"/>
</xf:action>
</xf:trigger>
</xf:group>
<xf:group>
<xf:label class="group-label">Tags</xf:label>
<xf:repeat id="tag-repeat" nodeset="instance('my-term')/Tag">
<xf:input ref="." class="Tag inline-delete" id="tag-input">
<xf:label>Tag (Keyword):</xf:label>
</xf:input>
<xf:trigger bind="tag-delete-trigger" class="inline-delete">
<xf:label>Delete Tag (Keyword)</xf:label>
<xf:delete nodeset="instance('my-term')/Tag[index('tag-repeat')]" ev:event="DOMActivate"/>
</xf:trigger>
</xf:repeat>
<xf:trigger>
<xf:label>Append New Tag (Keyword)</xf:label>
<xf:action ev:event="DOMActivate">
<xf:insert nodeset="instance('my-term')/Tag" at="last()" position="after"/>
<xf:setvalue ref="instance('my-term')/Tag[index('tag-repeat')]" value=""/>
<xf:setfocus control="tag-input"/>
</xf:action>
</xf:trigger>
</xf:group>
<xf:textarea class="Notes" ref="instance('my-term')/TermNoteText">
<xf:label>General notes:</xf:label>
<xf:hint>Any related notes about this term.</xf:hint>
</xf:textarea>
<xf:input ref="instance('my-term')/DataElement/DataElementIndicator">
<xf:label>Candidate Data Term:</xf:label>
<xf:hint>This term has a mapping to a registered data element.</xf:hint>
</xf:input>
<xf:group ref="instance('views')/data-element">
<xf:input ref="instance('my-term')/DataElement/DataElementDerivedIndicator">
<xf:label>Data Element Derived:</xf:label>
<xf:hint>This data element is derived from other data elements.</xf:hint>
</xf:input>
<xf:group ref="instance('views')/data-element-derived">
<xf:textarea class="large-textarea" ref="instance('my-term')/DataElement/DataElementDerivationRuleText">
<xf:label>Derivation Rules:</xf:label>
<xf:hint>Any rules used to derive this data element from other data elements.</xf:hint>
</xf:textarea>
</xf:group>
<xf:input ref="instance('my-term')/DataElement/DataElementIdentifierIndicator">
<xf:label>Data Element Identifier:</xf:label>
<xf:hint>This data element is use to identify data sets.</xf:hint>
</xf:input>
<xf:textarea class="large-textarea" ref="instance('my-term')/DataElementEnumerationsText">
<xf:label>Enumerations (Valid Codes):</xf:label>
<xf:hint>A listing of all valid values and definitions for the possible values of this data element.</xf:hint>
</xf:textarea>
<xf:textarea class="large-textarea" ref="instance('my-term')/DataElement/DataElementValidationRulesText">
<xf:label>Validation Rules:</xf:label>
<xf:hint>Any rules used to validate this data element.</xf:hint>
</xf:textarea>
<xf:input ref="instance('my-term')/DataElement/DataElementName" class="DataElementName">
<xf:label>Data Element Name:</xf:label>
<xf:hint>ISO name for this data element including the ObjectClass, Property and Representation Term using an UpperCamelCase notation.</xf:hint>
</xf:input>
</xf:group>
<xf:submit submission="save">
<xf:label>Save</xf:label>
</xf:submit>
</xf:group>
<a href="{cms:feedback-url()}">Feedback</a>
</body>
</html>
)