Tryag File Manager
Home
-
Turbo Force
Current Path :
/
home
/
cluster1
/
data
/
bu01
/
1121861
/
html
/
maxwell-old-archive
/
litprog-1.0
/
Upload File :
New :
File
Dir
/home/cluster1/data/bu01/1121861/html/maxwell-old-archive/litprog-1.0/tangle.html
<html><head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Tangle</title><meta name="generator" content="DocBook XSL Stylesheets V1.0"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="article" lang="en"><div class="titlepage"><div><h1 class="title"><a name="d0e3"></a>Tangle</h1></div><div><h3 class="subtitle"><i>Part of <i>Literate Programming in XML</i></i></h3></div><div><div class="author"><h3 class="author">Norman Walsh</h3></div></div><div><p class="releaseinfo"> $Id: tangle.xweb,v 1.4 2002/12/27 15:51:54 nwalsh Exp $ </p></div><div><p class="pubdate">05 Oct 2001</p></div><div></div><hr></div><div class="toc"><p><b>Table of Contents</b></p><dl><dt>1. <a href="#d0e54">The Stylesheet</a></dt><dd><dl><dt>1.1. <a href="#d0e70">The tangle.xsl Stylesheet</a></dt><dt>1.2. <a href="#d0e88">The xtangle.xsl Stylesheet</a></dt></dl></dd><dt>2. <a href="#d0e108">Initialization</a></dt><dt>3. <a href="#d0e120">The Root Template</a></dt><dt>4. <a href="#d0e141">Processing Fragments</a></dt><dd><dl><dt>4.1. <a href="#d0e171">Convenience Variables</a></dt><dt>4.2. <a href="#d0e178">Handle First Node</a></dt><dt>4.3. <a href="#d0e265">Handle Last Node</a></dt><dt>4.4. <a href="#d0e277">Handle the Middle Nodes</a></dt></dl></dd><dt>5. <a href="#d0e287">Copying Elements</a></dt><dd><dl><dt>5.1. <a href="#s.copy-passthrough">Copying src:passthrough</a></dt><dt>5.2. <a href="#s.copy-fragref">Copying src:fragref</a></dt><dt>5.3. <a href="#d0e392">Copying Disable-Output-Escaping Fragment References</a></dt><dt>5.4. <a href="#s.copy-default">Copying Everything Else</a></dt></dl></dd><dt>6. <a href="#d0e483">Copy XML Constructs</a></dt></dl></div><p>The <tt>tangle.xsl</tt> stylesheet transforms an XWEB document into a “source code” document. This is a relatively straightforward process: starting with the top fragment, all of the source fragments are simply stitched together, discarding any intervening documentation.</p><p>The resulting “tangled” document is ready for use by the appropriate processor.</p><div class="section" lang="en"><div class="titlepage"><div><h2 class="title" style="clear: both"><a name="d0e54"></a>1. The Stylesheet</h2></div></div><p>This XWEB document contains the source for two stylesheets, <tt>tangle.xsl</tt> and <tt>xtangle.xsl</tt>. Both stylesheets produce tangled sources, the latter is a simple customization of the former for producing XML vocabularies.</p><p>Each of these stylesheets performs some initialization, sets the output method appropriately, begins processing at the root template, and processes fragments, copying the content appropriately.</p><div class="section" lang="en"><div class="titlepage"><div><h3 class="title"><a name="d0e70"></a>1.1. The <tt>tangle.xsl</tt> Stylesheet</h3></div></div><p>The tangle stylesheet produces text output.</p><div xmlns:fo="http://www.w3.org/1999/XSL/Format" class="src-fragment"><a name="top"></a><table border="1" width="100%"><tr><td><p><b>§1.1.1</b></p></td></tr><tr><td><pre class="src:fragment"> 1| <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" | exclude-result-prefixes="src" | version="1.0"> | 5| <a href="#init"><i>§2.1. Initialization</i></a> | | <xsl:output method="text"/> | | <a href="#root.template"><i>§3.1. The Root Template</i></a> 10| <a href="#process-fragments"><i>§4.1. Processing Fragments</i></a> | <a href="#copy-elements"><i>§5.1. Copying Elements</i></a> | </xsl:stylesheet></pre></td></tr></table></div></div><div class="section" lang="en"><div class="titlepage"><div><h3 class="title"><a name="d0e88"></a>1.2. The <tt>xtangle.xsl</tt> Stylesheet</h3></div></div><p>The xtangle stylesheet produces XML output.</p><div xmlns:fo="http://www.w3.org/1999/XSL/Format" class="src-fragment"><a name="xtop"></a><table border="1" width="100%"><tr><td><p><b>§1.2.1</b></p></td></tr><tr><td><pre class="src:fragment"> 1| <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" | exclude-result-prefixes="src" | version="1.0"> | 5| <a href="#init"><i>§2.1. Initialization</i></a> | | <xsl:output method="xml"/> | | <a href="#root.template"><i>§3.1. The Root Template</i></a> 10| <a href="#process-fragments"><i>§4.1. Processing Fragments</i></a> | <a href="#copy-elements"><i>§5.1. Copying Elements</i></a> | <a href="#copy-xml-constructs"><i>§6.1. Copy XML Constructs</i></a> | </xsl:stylesheet></pre></td></tr></table></div></div></div><div class="section" lang="en"><div class="titlepage"><div><h2 class="title" style="clear: both"><a name="d0e108"></a>2. Initialization</h2></div></div><p>The stylesheet initializes the processor by loading its version information (stored in a separate file because it is shared by several stylesheets) and telling the processor to preserve whitespace on all input elements.</p><p>The stylesheet also constructs a key for the ID values used on fragments. Because XWEB documents do not have to be valid according to any particular DTD or Schema, the stylesheet cannot rely on having the IDs identified as type ID in the source document.</p><div xmlns:fo="http://www.w3.org/1999/XSL/Format" class="src-fragment"><a name="init"></a><table border="1" width="100%"><tr><td><p><b>§2.1</b>: <a href="#top">§1.1.1</a>, <a href="#xtop">§1.2.1</a></p></td></tr><tr><td><pre class="src:fragment"> 1| <xsl:include href="VERSION"/> | <xsl:preserve-space elements="*"/> | | <xsl:key name="fragment" 5| match="src:fragment" | use="@id"/> | | <xsl:param name="top" | select="'top'"/> 10| </pre></td></tr></table></div></div><div class="section" lang="en"><div class="titlepage"><div><h2 class="title" style="clear: both"><a name="d0e120"></a>3. The Root Template</h2></div></div><p>The root template begins processing at the root of the XWEB document. It outputs a couple of informative comments and then directs the processor to transform the <tt class="sgmltag-element">src:fragment</tt> element with the <tt>$top</tt> ID.</p><p>Source code fragments in the XWEB document are not required to be sequential, so it is necessary to distinguish one fragment as the primary starting point.</p><div xmlns:fo="http://www.w3.org/1999/XSL/Format" class="src-fragment"><a name="root.template"></a><table border="1" width="100%"><tr><td><p><b>§3.1</b>: <a href="#top">§1.1.1</a>, <a href="#xtop">§1.2.1</a></p></td></tr><tr><td><pre class="src:fragment"> 1| <xsl:template match="/"> 2| <xsl:apply-templates select="key('fragment', $top)"/> 3| </xsl:template></pre></td></tr></table></div></div><div class="section" lang="en"><div class="titlepage"><div><h2 class="title" style="clear: both"><a name="d0e141"></a>4. Processing Fragments</h2></div></div><p>In order to “tangle” an XWEB document, we need only copy the contents of the fragments to the result tree.</p><p>Processing <tt class="sgmltag-element">src:fragment</tt> elements is conceptually easy, simply copy their children. However, if we simply used:</p><pre class="screen"><xsl:apply-templates mode="copy"/></pre><p>we'd copy the newlines at the beginning and end of a fragment that the author might have added for editing convenience. In environments where whitespace is significant (e.g., Python), this would introduce errors. We must avoid copying the first and last newlines. </p><div xmlns:fo="http://www.w3.org/1999/XSL/Format" class="src-fragment"><a name="process-fragments"></a><table border="1" width="100%"><tr><td><p><b>§4.1</b>: <a href="#top">§1.1.1</a>, <a href="#xtop">§1.2.1</a></p></td></tr><tr><td><pre class="src:fragment"> 1| <xsl:template match="src:fragment"> | <a href="#cc-storevars"><i>§4.1.1. Convenience Variables</i></a> | <a href="#cc-first-node"><i>§4.2.1. Handle First Node</i></a> | <a href="#cc-middle-nodes"><i>§4.4.1. Handle the Middle Nodes</i></a> 5| <a href="#cc-last-node"><i>§4.3.1. Handle Last Node</i></a> | </xsl:template></pre></td></tr></table></div><div class="section" lang="en"><div class="titlepage"><div><h3 class="title"><a name="d0e171"></a>4.1. Convenience Variables</h3></div></div><p>For convenience, we store subexpressions containing the first, last, and all the middle nodes in variables.</p><div xmlns:fo="http://www.w3.org/1999/XSL/Format" class="src-fragment"><a name="cc-storevars"></a><table border="1" width="100%"><tr><td><p><b>§4.1.1</b>: <a href="#process-fragments">§4.1</a></p></td></tr><tr><td><pre class="src:fragment"> 1| <xsl:variable name="first-node" | select="node()[1]"/> | <xsl:variable name="middle-nodes" | select="node()[position() > 1 and position() < last()]"/> 5| <xsl:variable name="last-node" | select="node()[position() > 1 and position() = last()]"/></pre></td></tr></table></div></div><div class="section" lang="en"><div class="titlepage"><div><h3 class="title"><a name="d0e178"></a>4.2. Handle First Node</h3></div></div><p>Handling the leading newline is conceptually a simple matter of looking at the first character on the line and skipping it if it is a newline. A slight complexity is introduced by the fact that if the fragment contains only a single text node, the first node is also the last node and we have to possibly trim off a trialing newline as well. We separate that out as a special case. </p><div xmlns:fo="http://www.w3.org/1999/XSL/Format" class="src-fragment"><a name="cc-first-node"></a><table border="1" width="100%"><tr><td><p><b>§4.2.1</b>: <a href="#process-fragments">§4.1</a></p></td></tr><tr><td><pre class="src:fragment"> 1| <xsl:choose> | <a href="#cc-only-node"><i>§4.2.1.1. Handle A Fragment that Contains a Single Node</i></a> | <a href="#cc-leading-nl"><i>§4.2.2.1. Handle a First Node with a Leading Newline</i></a> | <a href="#cc-no-leading-nl"><i>§4.2.3.1. Handle a First Node without a Leading Newline</i></a> 5| </xsl:choose></pre></td></tr></table></div><div class="section" lang="en"><div class="titlepage"><div><h4 class="title"><a name="d0e191"></a>4.2.1. Handle A Fragment that Contains a Single Node</h4></div></div><p>If the <tt>$first-node</tt> is a text node and the fragment contains only a single child, then it is also the last node.</p><p>In order to deal with a single text node child, we must address four cases: the node has both leading and trailing newlines, the node has only leading newlines, only trailing newlines, or no newlines at all.</p><div xmlns:fo="http://www.w3.org/1999/XSL/Format" class="src-fragment"><a name="cc-only-node"></a><table border="1" width="100%"><tr><td><p><b>§4.2.1.1</b>: <a href="#cc-first-node">§4.2.1</a></p></td></tr><tr><td><pre class="src:fragment"> 1| <xsl:when test="$first-node = text() and count(node()) = 1"> | <a href="#cc-more-conv"><i>§4.2.1.1.1. More Convenience Variables</i></a> | <xsl:choose> | <a href="#cc-both"><i>§4.2.1.2.1. Handle a Single Node With Leading and Trailing Newlines</i></a> 5| <a href="#cc-leading"><i>§4.2.1.3.1. Handle a Single Node With Only Leading Newlines</i></a> | <a href="#cc-trailing"><i>§4.2.1.4.1. Handle a Single Node with Only Trailing Newlines</i></a> | <a href="#cc-none"><i>§4.2.1.5.1. Handle a Single Node with No Newlines</i></a> | </xsl:choose> | </xsl:when></pre></td></tr></table></div><div class="section" lang="en"><div class="titlepage"><div><h5 class="title"><a name="d0e213"></a>4.2.1.1. More Convenience Variables</h5></div></div><p>For convenience, we calculate whether or not the node in question has leading and/or trailing newlines and store those results in variables. </p><div xmlns:fo="http://www.w3.org/1999/XSL/Format" class="src-fragment"><a name="cc-more-conv"></a><table border="1" width="100%"><tr><td><p><b>§4.2.1.1.1</b>: <a href="#cc-only-node">§4.2.1.1</a></p></td></tr><tr><td><pre class="src:fragment"> 1| <xsl:variable name="leading-nl" | select="substring($first-node, 1, 1) = ' | '"/> | <xsl:variable name="trailing-nl" 5| select="substring($first-node, string-length($first-node), 1) = ' | '"/></pre></td></tr></table></div></div><div class="section" lang="en"><div class="titlepage"><div><h5 class="title"><a name="d0e220"></a>4.2.1.2. Handle a Single Node With Leading and Trailing Newlines</h5></div></div><p>If the node has both leading and trailing newlines, trim a character off each end.</p><div xmlns:fo="http://www.w3.org/1999/XSL/Format" class="src-fragment"><a name="cc-both"></a><table border="1" width="100%"><tr><td><p><b>§4.2.1.2.1</b>: <a href="#cc-only-node">§4.2.1.1</a></p></td></tr><tr><td><pre class="src:fragment"> 1| <xsl:when test="$leading-nl and $trailing-nl"> 2| <xsl:value-of select="substring($first-node, 2, string-length($first-node)-2)"/> 3| </xsl:when></pre></td></tr></table></div></div><div class="section" lang="en"><div class="titlepage"><div><h5 class="title"><a name="d0e227"></a>4.2.1.3. Handle a Single Node With Only Leading Newlines</h5></div></div><p>If the node has only leading newlines, trim off the first character. </p><div xmlns:fo="http://www.w3.org/1999/XSL/Format" class="src-fragment"><a name="cc-leading"></a><table border="1" width="100%"><tr><td><p><b>§4.2.1.3.1</b>: <a href="#cc-only-node">§4.2.1.1</a></p></td></tr><tr><td><pre class="src:fragment"> 1| <xsl:when test="$leading-nl"> 2| <xsl:value-of select="substring($first-node, 2)"/> 3| </xsl:when></pre></td></tr></table></div></div><div class="section" lang="en"><div class="titlepage"><div><h5 class="title"><a name="d0e234"></a>4.2.1.4. Handle a Single Node with Only Trailing Newlines</h5></div></div><p>If the node has only trailing newlines, trim off the last character. </p><div xmlns:fo="http://www.w3.org/1999/XSL/Format" class="src-fragment"><a name="cc-trailing"></a><table border="1" width="100%"><tr><td><p><b>§4.2.1.4.1</b>: <a href="#cc-only-node">§4.2.1.1</a></p></td></tr><tr><td><pre class="src:fragment"> 1| <xsl:when test="$trailing-nl"> 2| <xsl:value-of select="substring($first-node, 1, string-length($first-node)-1)"/> 3| </xsl:when></pre></td></tr></table></div></div><div class="section" lang="en"><div class="titlepage"><div><h5 class="title"><a name="d0e241"></a>4.2.1.5. Handle a Single Node with No Newlines</h5></div></div><p>Otherwise, the node has no newlines and it is simply printed. </p><div xmlns:fo="http://www.w3.org/1999/XSL/Format" class="src-fragment"><a name="cc-none"></a><table border="1" width="100%"><tr><td><p><b>§4.2.1.5.1</b>: <a href="#cc-only-node">§4.2.1.1</a></p></td></tr><tr><td><pre class="src:fragment"> 1| <xsl:otherwise> 2| <xsl:value-of select="$first-node"/> 3| </xsl:otherwise></pre></td></tr></table></div></div></div><div class="section" lang="en"><div class="titlepage"><div><h4 class="title"><a name="d0e248"></a>4.2.2. Handle a First Node with a Leading Newline</h4></div></div><p>If the first node is a text node and begins with a newline, trim off the first character.</p><div xmlns:fo="http://www.w3.org/1999/XSL/Format" class="src-fragment"><a name="cc-leading-nl"></a><table border="1" width="100%"><tr><td><p><b>§4.2.2.1</b>: <a href="#cc-first-node">§4.2.1</a></p></td></tr><tr><td><pre class="src:fragment"> 1| <xsl:when test="$first-node = text() and substring($first-node, 1, 1) = ' 2| '"> 3| <xsl:value-of select="substring($first-node, 2)"/> 4| </xsl:when></pre></td></tr></table></div></div><div class="section" lang="en"><div class="titlepage"><div><h4 class="title"><a name="d0e255"></a>4.2.3. Handle a First Node without a Leading Newline</h4></div></div><p>Otherwise, the first node is not a text node or does not begin with a newline, so use the “copy” mode to copy it to the result tree.</p><div xmlns:fo="http://www.w3.org/1999/XSL/Format" class="src-fragment"><a name="cc-no-leading-nl"></a><table border="1" width="100%"><tr><td><p><b>§4.2.3.1</b>: <a href="#cc-first-node">§4.2.1</a></p></td></tr><tr><td><pre class="src:fragment"> 1| <xsl:otherwise> 2| <xsl:apply-templates select="$first-node" 3| mode="copy"/> 4| </xsl:otherwise></pre></td></tr></table></div></div></div><div class="section" lang="en"><div class="titlepage"><div><h3 class="title"><a name="d0e265"></a>4.3. Handle Last Node</h3></div></div><p>Handling the last node is roughly analagous to handling the first node, except that we know this code is only evaluated if the last node is not also the first node.</p><p>If the last node is a text node and ends with a newline, strip it off. Otherwise, just copy the content of the last node using the “copy” mode. </p><div xmlns:fo="http://www.w3.org/1999/XSL/Format" class="src-fragment"><a name="cc-last-node"></a><table border="1" width="100%"><tr><td><p><b>§4.3.1</b>: <a href="#process-fragments">§4.1</a></p></td></tr><tr><td><pre class="src:fragment"> 1| <xsl:choose> | <xsl:when test="$last-node = text() and substring($last-node, string-length($last-node), 1) = ' | '"> | <xsl:value-of select="substring($last-node, 1, string-length($last-node)-1)"/> 5| </xsl:when> | <xsl:otherwise> | <xsl:apply-templates select="$last-node" | mode="copy"/> | </xsl:otherwise> 10| </xsl:choose></pre></td></tr></table></div></div><div class="section" lang="en"><div class="titlepage"><div><h3 class="title"><a name="d0e277"></a>4.4. Handle the Middle Nodes</h3></div></div><p>The middle nodes are easy, just copy them using the “copy” mode.</p><div xmlns:fo="http://www.w3.org/1999/XSL/Format" class="src-fragment"><a name="cc-middle-nodes"></a><table border="1" width="100%"><tr><td><p><b>§4.4.1</b>: <a href="#process-fragments">§4.1</a></p></td></tr><tr><td><pre class="src:fragment"> 1| <xsl:apply-templates select="$middle-nodes" 2| mode="copy"/></pre></td></tr></table></div></div></div><div class="section" lang="en"><div class="titlepage"><div><h2 class="title" style="clear: both"><a name="d0e287"></a>5. Copying Elements</h2></div></div><p>Copying elements to the result tree can be divided into four cases: <a href="#s.copy-passthrough" title="5.1. Copying src:passthrough">copying passthrough elements</a>, <a href="#s.copy-fragref" title="5.2. Copying src:fragref">copying fragment references</a>, and <a href="#s.copy-default" title="5.4. Copying Everything Else">copying everything else</a>.</p><div xmlns:fo="http://www.w3.org/1999/XSL/Format" class="src-fragment"><a name="copy-elements"></a><table border="1" width="100%"><tr><td><p><b>§5.1</b>: <a href="#top">§1.1.1</a>, <a href="#xtop">§1.2.1</a></p></td></tr><tr><td><pre class="src:fragment"><a href="#copy-passthrough"><i> 1| §5.1.1. Copying src:passthrough</i></a> 2| <a href="#copy-fragref"><i>§5.2.1. Copying src:fragref</i></a> 3| <a href="#copy-default"><i>§5.4.1. Copying Everything Else</i></a></pre></td></tr></table></div><div class="section" lang="en"><div class="titlepage"><div><h3 class="title"><a name="s.copy-passthrough"></a>5.1. Copying <tt class="sgmltag-element">src:passthrough</tt></h3></div></div><p>Passthrough elements contain text that is intended to appear literally in the result tree. We use XSLT “disable-output-escaping” to copy it without interpretation:</p><div xmlns:fo="http://www.w3.org/1999/XSL/Format" class="src-fragment"><a name="copy-passthrough"></a><table border="1" width="100%"><tr><td><p><b>§5.1.1</b>: <a href="#copy-elements">§5.1</a></p></td></tr><tr><td><pre class="src:fragment"> 1| <xsl:template match="src:passthrough" | mode="copy"> | <xsl:value-of disable-output-escaping="yes" | select="."/> 5| </xsl:template></pre></td></tr></table></div></div><div class="section" lang="en"><div class="titlepage"><div><h3 class="title"><a name="s.copy-fragref"></a>5.2. Copying <tt class="sgmltag-element">src:fragref</tt></h3></div></div><p>With a unique exception, copying fragment references is straightforward: find the fragment that is identified by the cross-reference and process it. </p><p>The single exception arises only in the processing of <tt class="sgmltag-element">src:fragref</tt> elements in the <tt class="sgmltag-element">weave.xweb</tt> document. There is a single template in the “weave” program that needs to copy a literal <tt class="sgmltag-element">src:fragref</tt> element to the result tree. That is the <span class="emphasis"><em>only</em></span> time the <a href="#doe-fragref"><i xmlns:fo="http://www.w3.org/1999/XSL/Format">§5.3.1. Copying Disable-Output-Escaping Fragment References</i></a> branch is executed. </p><div xmlns:fo="http://www.w3.org/1999/XSL/Format" class="src-fragment"><a name="copy-fragref"></a><table border="1" width="100%"><tr><td><p><b>§5.2.1</b>: <a href="#copy-elements">§5.1</a></p></td></tr><tr><td><pre class="src:fragment"> 1| <xsl:template match="src:fragref" | mode="copy"> | <xsl:variable name="node" | select="."/> 5| <xsl:choose> | <a href="#doe-fragref"><i>§5.3.1. Copying Disable-Output-Escaping Fragment References</i></a> | <a href="#normal-fragref"><i>§5.2.1.1. Copying Normal Fragment References</i></a> | </xsl:choose> | </xsl:template></pre></td></tr></table></div><div class="section" lang="en"><div class="titlepage"><div><h4 class="title"><a name="d0e351"></a>5.2.1. Copying Normal Fragment References</h4></div></div><p>To copy a normal fragment reference, identify what the <tt class="sgmltag-attribute">linkend</tt> attribute points to, make sure it is valid, and process it.</p><div xmlns:fo="http://www.w3.org/1999/XSL/Format" class="src-fragment"><a name="normal-fragref"></a><table border="1" width="100%"><tr><td><p><b>§5.2.1.1</b>: <a href="#copy-fragref">§5.2.1</a></p></td></tr><tr><td><pre class="src:fragment"> 1| <xsl:otherwise> | <xsl:variable name="fragment" | select="key('fragment', @linkend)"/> | <a href="#fragref-unique"><i>§5.2.1.1.1. Fragment is Unique</i></a> 5| <a href="#fragref-isfragment"><i>§5.2.1.2.1. Fragment is a src:fragment</i></a> | <xsl:apply-templates select="$fragment"/> | </xsl:otherwise></pre></td></tr></table></div><div class="section" lang="en"><div class="titlepage"><div><h5 class="title"><a name="d0e365"></a>5.2.1.1. Fragment is Unique</h5></div></div><p>Make sure that the <tt class="sgmltag-attribute">linkend</tt> attribute points to exactly one node in the source tree. It is an error if no element exists with that ID value or if more than one exists.</p><div xmlns:fo="http://www.w3.org/1999/XSL/Format" class="src-fragment"><a name="fragref-unique"></a><table border="1" width="100%"><tr><td><p><b>§5.2.1.1.1</b>: <a href="#normal-fragref">§5.2.1.1</a></p></td></tr><tr><td><pre class="src:fragment"> 1| <xsl:if test="count($fragment) != 1"> | <xsl:message terminate="yes"> | <xsl:text>Link to fragment "</xsl:text> | <xsl:value-of select="@linkend"/> 5| <xsl:text>" does not uniquely identify a single fragment.</xsl:text> | </xsl:message> | </xsl:if></pre></td></tr></table></div></div><div class="section" lang="en"><div class="titlepage"><div><h5 class="title"><a name="d0e375"></a>5.2.1.2. Fragment is a <tt class="sgmltag-element">src:fragment</tt></h5></div></div><p>Make sure that the <tt class="sgmltag-attribute">linkend</tt> attribute points to a <tt class="sgmltag-element">src:fragment</tt> element.</p><p>FIXME: this code should test the namespace name of the $fragment</p><div xmlns:fo="http://www.w3.org/1999/XSL/Format" class="src-fragment"><a name="fragref-isfragment"></a><table border="1" width="100%"><tr><td><p><b>§5.2.1.2.1</b>: <a href="#normal-fragref">§5.2.1.1</a></p></td></tr><tr><td><pre class="src:fragment"> 1| <xsl:if test="local-name($fragment) != 'fragment'"> | <xsl:message terminate="yes"> | <xsl:text>Link "</xsl:text> | <xsl:value-of select="@linkend"/> 5| <xsl:text>" does not point to a src:fragment.</xsl:text> | </xsl:message> | </xsl:if></pre></td></tr></table></div></div></div></div><div class="section" lang="en"><div class="titlepage"><div><h3 class="title"><a name="d0e392"></a>5.3. Copying Disable-Output-Escaping Fragment References</h3></div></div><p>A <tt class="sgmltag-element">src:fragref</tt> that specifies <tt class="sgmltag-attribute">disable-output-escaping</tt> is treated essentially as if it was <a href="#s.copy-default" title="5.4. Copying Everything Else">any other element</a>. The only exception is that the <tt class="sgmltag-attribute">disable-output-escaping</tt> attribute is not copied.</p><p>Because tangle and weave are XSLT stylesheets that process XSLT stylesheets, processing <tt class="sgmltag-element">src:fragref</tt> poses a unique challenge.</p><p>In ordinary tangle processing, they are expanded and replaced with the content of the fragment that they point to. But when <tt>weave.xweb</tt> is tangled, they must be copied through literally. The <tt class="sgmltag-attribute">disable-output-escaping</tt> attribute provides the hook that allows this. </p><div xmlns:fo="http://www.w3.org/1999/XSL/Format" class="src-fragment"><a name="doe-fragref"></a><table border="1" width="100%"><tr><td><p><b>§5.3.1</b>: <a href="#copy-fragref">§5.2.1</a></p></td></tr><tr><td><pre class="src:fragment"> 1| <xsl:when test="@disable-output-escaping='yes'"> | <xsl:element name="{name(.)}" | namespace="{namespace-uri(.)}"> | <a href="#copy-namespaces"><i>§5.4.1.1. Copy Namespaces</i></a> 5| <xsl:for-each select="@*"> | <xsl:if test="not(name(.) = 'disable-output-escaping')"> | <xsl:copy/> | </xsl:if> | </xsl:for-each> 10| <xsl:apply-templates mode="copy"/> | </xsl:element> | </xsl:when></pre></td></tr></table></div></div><div class="section" lang="en"><div class="titlepage"><div><h3 class="title"><a name="s.copy-default"></a>5.4. Copying Everything Else</h3></div></div><p>Everything else is copied verbatim. This is a five step process: </p><div class="orderedlist"><ol type="1"><li><p>Save a copy of the context node in <tt>$node</tt> so that we can refer to it later from inside an <tt class="sgmltag-element">xsl:for-each</tt>.</p></li><li><p>Construct a new node in the result tree with the same qualified name and namespace as the context node.</p></li><li><p>Copy the namespace nodes on the context node to the new node in the result tree. We must do this manually because the XWEB file may have broken the content of this element into several separate fragments. Breaking things into separate fragments makes it impossible for the XSLT processor to always construct the right namespace nodes automatically.</p></li><li><p>Copy the attributes. </p></li><li><p>Copy the children. </p></li></ol></div><div xmlns:fo="http://www.w3.org/1999/XSL/Format" class="src-fragment"><a name="copy-default"></a><table border="1" width="100%"><tr><td><p><b>§5.4.1</b>: <a href="#copy-elements">§5.1</a></p></td></tr><tr><td><pre class="src:fragment"> 1| <xsl:template match="*" | mode="copy"> | <xsl:variable name="node" | select="."/> 5| <xsl:element name="{name(.)}" | namespace="{namespace-uri(.)}"> | <a href="#copy-namespaces"><i>§5.4.1.1. Copy Namespaces</i></a> | <xsl:copy-of select="@*"/> | <xsl:apply-templates mode="copy"/> 10| </xsl:element> | </xsl:template></pre></td></tr></table></div><p>For non-XML source docuements, this template will never match because there will be no XML elements in the source fragments.</p><div class="section" lang="en"><div class="titlepage"><div><h4 class="title"><a name="d0e471"></a>5.4.1. Copy Namespaces</h4></div></div><p>Copying the namespaces is a simple loop over the elements on the <tt>namespace</tt> axis, with one wrinkle.</p><p>It is an error to copy a namespace node onto an element if a namespace node is already present for that namespace. The fact that we're running this loop in a context where we've constructed the result node explicitly in the correct namespace means that attempting to copy that namespace node again will produce an error. We work around this problem by explicitly testing for that namespace and not copying it. </p><div xmlns:fo="http://www.w3.org/1999/XSL/Format" class="src-fragment"><a name="copy-namespaces"></a><table border="1" width="100%"><tr><td><p><b>§5.4.1.1</b>: <a href="#doe-fragref">§5.3.1</a>, <a href="#copy-default">§5.4.1</a></p></td></tr><tr><td><pre class="src:fragment"> 1| <xsl:for-each select="namespace::*"> | <xsl:if test="string(.) != namespace-uri($node)"> | <xsl:copy/> | </xsl:if> 5| </xsl:for-each></pre></td></tr></table></div></div></div></div><div class="section" lang="en"><div class="titlepage"><div><h2 class="title" style="clear: both"><a name="d0e483"></a>6. Copy XML Constructs</h2></div></div><p>In the <tt>xtangle.xsl</tt> stylesheet, we also want to preserve XML constructs (processing instructions and comments) that we encounter in the fragments.</p><p>Note that many implementations of XSLT do not provide comments in the source document (they are discarded before building the tree), in which case the comments cannot be preserved.</p><div xmlns:fo="http://www.w3.org/1999/XSL/Format" class="src-fragment"><a name="copy-xml-constructs"></a><table border="1" width="100%"><tr><td><p><b>§6.1</b>: <a href="#xtop">§1.2.1</a></p></td></tr><tr><td><pre class="src:fragment"> 1| <xsl:template match="processing-instruction()" | mode="copy"> | <xsl:processing-instruction name="{name(.)}"> | <xsl:value-of select="."/> 5| </xsl:processing-instruction> | </xsl:template> | | <xsl:template match="comment()" | mode="copy"> 10| <xsl:comment> | <xsl:value-of select="."/> | </xsl:comment> | </xsl:template></pre></td></tr></table></div></div></div></body></html>