XRX/Glossary Term Editor

Motivation
You 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
Create 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
To 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.

XForms Application
This 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.



   

      {if ($new='true') then  else }     {cms:header} <a class="breadcrumb" href="../../index.xhtml">Metadata Registry</a> &gt; <a class="breadcrumb" href="../index.xhtml">Glossary Manager</a> {if ($new='true') then ('Create New') else ('Update')} Project Glossary Term {$form} - {$form-version} - File: {$file} <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> <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> )

Search Application
Back: Selection List Generator • Next: FAQ Manager