Talk:NotesToRefs.xsl
Jump to navigation
Jump to search
For obscure reasons I was poking around this stylesheet, trying to figure out what it did. In doing so I started to re-write it a bit in my head, and then thought “why not re-write it for real?”.
I think the following performs the same task. I also think it is easier to follow, and is more “XSLT-like” (i.e., declarative) in its structure, although others may disagree.
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" exclude-result-prefixes="tei" xmlns:tei="http://www.tei-c.org/ns/1.0" xmlns="http://www.tei-c.org/ns/1.0" version="1.0"> <!-- possibly improved version of movingnotes.xsl, which I found at http://wiki.tei-c.org/index.php/NotesToRefs.xsl — Syd Bauman, 2011-04-09 --> <!-- just to make it easy to change the type= of our generated <ref> elements --> <xsl:variable name="refType" select="'nota'"/> <!-- identity transform --> <xsl:template match="comment()|processing-instruction()|text()"> <xsl:copy/> </xsl:template> <xsl:template match="*"> <xsl:copy> <xsl:copy-of select="@*"/> <xsl:apply-templates select="comment()|processing-instruction()|text()|*"/> </xsl:copy> </xsl:template> <!-- if <text> doesn't have a <back>, give it one ... --> <xsl:template match="tei:text"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> <xsl:if test="not( tei:back )"> <back> <!-- ... inserting our note <div> into it --> <xsl:call-template name="make-note-div"/> </back> </xsl:if> </xsl:copy> </xsl:template> <!-- insert our note <div> at the end of source <back> --> <xsl:template match="back"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> <xsl:call-template name="make-note-div"/> </xsl:copy> </xsl:template> <xsl:template name="make-note-div"> <div type="notes"> <head xml:lang="la">Notae</head> <pb n="nts"/> <xsl:apply-templates select="//tei:note" mode="moveback"/> </div> </xsl:template> <!-- When we come across a <note> in normal processing, put out a <ref> --> <!-- instead. (We use <ref> instead of <ptr> as that's what PhiloLogic --> <!-- calls for, even though <ptr> would be more appropriate.) --> <xsl:template match="tei:note"> <ref type="{$refType}" target="{concat('n',generate-id(.))}" xmlns="http://www.tei-c.org/ns/1.0"> <xsl:attribute name="xml:id"> <!-- see [1] --> <xsl:value-of select="concat('r',generate-id(.))"/> </xsl:attribute> <xsl:attribute name="n"> <xsl:number/> </xsl:attribute> </ref> </xsl:template> <!-- When we call for a <note> in move-me-to-back mode, put out a --> <!-- copy of the context node (the <note>) with the needed extra --> <!-- attributes. --> <xsl:template match="tei:note" mode="moveback"> <note place="foot" target="{concat('r',generate-id(.))}"> <!-- see [1] --> <xsl:attribute name="xml:id"> <xsl:value-of select="concat('n',generate-id(.))"/> </xsl:attribute> <!-- copy source attrs, but don't overwrite the ones we just --> <!-- created --> <xsl:copy-of select="@*[not(attribute::xml:id or attribute::target or attribute::place)]"/> <xsl:apply-templates select="node()"/> </note> <!-- add a carriage return, for tidiness --> <xsl:text> </xsl:text> </xsl:template> <!-- [1] You can't create the xml:id= attribute using an attribute value template (at least not using xsltproc). I.e., xml:id={concat('n',generate-id(.))} results in an error. I *think* this is because the result of evaluating an attribute value template is always a string, but an NCName is required. When the XSLT engine builds a tree fragment (as with <xsl:attribute>), it can build something more complex than a string, in this case an NCName. --> </xsl:stylesheet>