Here are some hints, how the XSLT scripts should be modified. All these examples are taken from an XSLT transformer with XSL-FO result - feel free to modify these snippets for your result document appropriately.
First, you must define EuroMath2 namespace, of course. Just put this definition into root element of XSLT:
xmlns:emp="http://www.uniba.sk/euromath/reserved" xmlns:empar="http://www.uniba.sk/euromath/parameters"
Use the following template to handle emp:mark
elements:
<xsl:template match="emp:mark"> <xsl:copy-of select="."/> </xsl:template>
You may safely ignore processing these elements if schema doesn't support inserting elements from another namespaces.
This template prints out the ID of node(s):
<!-- Prints ID of given node. --> <xsl:template match="@*" mode="emp.id" priority="1"> <xsl:value-of select="../@emp:id"/><xsl:text>@</xsl:text><xsl:value-of select="name()"/>:0 </xsl:template> <xsl:template match="*" mode="emp.id" priority="1"> <xsl:value-of select="@emp:id"/>:0 </xsl:template> <xsl:template match="node()" mode="emp.id" priority="0"> <xsl:value-of select="../@emp:id"/>;<xsl:value-of select="count(preceding-sibling::node())"/>:0 </xsl:template>
Note that the :0
part is optional and may not be used at all.
It serves for diferencing equal IDs: when element
is copied multiple times in the result XML file and the XML processor does not like
multiple equal id attributes. You may replace :0
with some XSLT
code that is able to generate unique values for one node, however this step is optional:
XSLT/exporter, renderer and coordinator must be able to uniqualize emp:id
s
if they need unique ids.
To instantiate attribute containing ID of given node, the following snippet
can be used: (note that this attribute is instantiated only when
the emp:id
attribute exists - it is useful for XSLT to be usable both with
and without EuroMath)
<!-- Instantiates an id attribute for given node. --> <xsl:template match="*" mode="emp.createIdAttr" priority="1"> <xsl:if test="@emp:id"> <xsl:attribute name="emp:id"><xsl:apply-templates select="." mode="emp.id"/></xsl:attribute> </xsl:if> </xsl:template> <xsl:template match="node() | @*" mode="emp.createIdAttr" priority="0"> <xsl:if test="../@emp:id and $empar:processingSource"> <xsl:attribute name="emp:id"><xsl:apply-templates select="." mode="emp.id"/></xsl:attribute> </xsl:if> </xsl:template>
<xsl:value-of select="nodeset">
works OK, if you
don't want to transport IDs of text.
If you do, use <xsl:apply-templates select="nodeset"
mode="emp.text">
instead, and put following template
into your XSLT script:
<!-- Prints text value of given node with proper IDs, as if by the <xsl:value-of/> call. --> <xsl:template match="*" mode="emp.text"> <xsl:apply-templates mode="emp.text"/> </xsl:template> <xsl:template match="text()" mode="emp.text"> <xsl:choose> <xsl:when test="../@emp:id and $empar:processingSource"> <fo:inline> <xsl:apply-templates select="." mode="emp.createIdAttr"/> <xsl:value-of select="."/> </fo:inline> </xsl:when> <xsl:otherwise> <xsl:value-of select="."/> </xsl:otherwise> </xsl:choose> </xsl:template>
Easiest way to transfer IDs of text is to define this template:
<!-- retains ids of all text nodes --> <xsl:template match="text()"> <apply-templates select="." mode="emp.text"/> </xsl:template>
Because each element may contain the emp:id
attribute, then we must replace all
XPath tests such as @*
with the following test:
@*[name()!='emp:id']
To detect whether the ID of context node is synthetic or not please use this template:
contains(substring-before(@emp:id, ':'), '@;')