[oXygen-user] About oXygen XML Editor
About oXygen XML Editor
Fri Jul 17 23:14:59 CDT 2015
About oXygen XML Editor
///////////////////////////////////////////
Controlled Attribute Values (Part 2 - Advanced)
Posted: 17 Jul 2015 03:42 AM PDT
http://feedproxy.google.com/~r/AboutOxygenXmlEditor/~3/NE2VjDi24KA/controlled-attribute-values-part-2.html?utm_source=feedburner&utm_medium=email
As already presented in Controlled Attribute Values for your
DITA Project, Oxygen allows you to add or replace possible values
for attributes or elements based on a simple configuration file. A
more complex scenario is one in which in order to decide which values
to provide, you need more context information. Let's take this DITA
fragment: <metadata>
<othermeta name="name" content="value"/>
</metadata> What we want is to offer proposals for @content but the
possible values for @content depend on the value of @name. We will
see how we can solve this dependency. The configuration
file The configuration file (cc_value_config.xml) allows
calling an XSLT stylesheet and that's just what we will
do:<match elementName="othermeta" attributeName="content">
<xslt href="meta.xsl" useCache="false"/>
</match> As you can see, we can't express the dependency between
@content and @name inside the configuration file . I also want to
mention that because the values for @content are dynamic, we want
the XSLT script to execute every time the values are requested (we
shouldn't cache the results). We enforce this by setting
@useCache to false. The XSLT script The XSLT script
has access to the XML document (through the documentSystemID
parameter) but it lacks any context information, we can't really tell for
which othermeta element was the script invoked. To counter this
limitation, we will use Java extension functions and we will call
Oxygen's Java-based API from the XSLT. Here how it
looks:<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xd="http://www.oxygenxml.com/ns/doc/xsl"
xmlns:tei="http://www.oxygenxml.com/ns/doc/xsl"
xmlns:prov="java:ro.sync.exml.workspace.api.PluginWorkspaceProvider"
xmlns:work="java:ro.sync.exml.workspace.api.PluginWorkspace"
xmlns:editorAccess="java:ro.sync.exml.workspace.api.editor.WSEditor"
xmlns:saxon="http://saxon.sf.net/"
xmlns:textpage="java:ro.sync.exml.workspace.api.editor.page.text.xml.WSXMLTextEditorPage"
xmlns:authorPage="java:ro.sync.exml.workspace.api.editor.page.author.WSAuthorEditorPage"
xmlns:ctrl="java:ro.sync.ecss.extensions.api.AuthorDocumentController"
exclude-result-prefixes="xs xd"
version="2.0">
<xsl:param name="documentSystemID" as="xs:string"></xsl:param>
<xsl:template name="start">
<xsl:variable name="workspace" select="prov:getPluginWorkspace()"/>
<xsl:variable name="editorAccess"
select="work:getEditorAccess($workspace, xs:anyURI($documentSystemID), 0)"/>
<xsl:variable name="pageID" as="xs:string"
select="editorAccess:getCurrentPageID($editorAccess)"/>
<xsl:variable name="name" as="xs:string">
<xsl:choose>
<xsl:when test="$pageID='Text'">
<xsl:variable name="textpage"
select="editorAccess:getCurrentPage($editorAccess)"/>
<!-- In the text page, the context is the @content
attribute -->
<xsl:value-of
select="textpage:evaluateXPath($textpage, 'xs:string(./parent::node()/@name)')"/>
</xsl:when>
<xsl:when test="$pageID='Author'">
<xsl:variable name="authorPage"
select="editorAccess:getCurrentPage($editorAccess)"/>
<xsl:variable name="caretOffset"
select="authorPage:getCaretOffset($authorPage)"/>
<xsl:variable name="ctrl"
select="authorPage:getDocumentController($authorPage)"/>
<xsl:variable name="contextNode"
select="ctrl:getNodeAtOffset($ctrl, $caretOffset)"/>
<!-- In the author page, the context is the "othermeta"
element -->
<xsl:value-of
select="ctrl:evaluateXPath($ctrl, 'xs:string(@name)', $contextNode,
false(), false(), false(), false())[1]"/>
</xsl:when>
</xsl:choose>
</xsl:variable>
<items>
<xsl:choose>
<xsl:when test="$name = 'temperatureScale'">
<item value="Celsius" annotation="(symbol C)"/>
<item value="Fahrenheit" annotation="(symbol F)"/>
</xsl:when>
<xsl:when test="$name = 'measurement'">
<item value="Metric" annotation="Metric system"/>
<item value="Imperial" annotation="Also known as
British Imperial"/>
</xsl:when>
</xsl:choose>
</items>
</xsl:template>
</xsl:stylesheet> It is also worth mentioning that in the next Oxygen
version (17.1) we will provide a more elegant solution to this
situation. The XSLT script will receive a new parameter, an XPath
expression that will identify the element for which content completion was
invoked. But maybe we will talk about that in a future post...
--
You are subscribed to email updates from "About oXygen XML Editor."
To stop receiving these emails, you may unsubscribe now:
https://feedburner.google.com/fb/a/mailunsubscribe?k=y_tRXtumvTurKTedh51JnlYsGXw
Email delivery powered by Google.
Google Inc., 1600 Amphitheatre Parkway, Mountain View, CA 94043, United
States
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.oxygenxml.com/pipermail/oxygen-user/attachments/20150718/5378f314/attachment.html>
More information about the oXygen-user
mailing list