<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.0 20120330//EN" "JATS-archivearticle1.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink">
  <front>
    <journal-meta />
    <article-meta>
      <title-group>
        <article-title>XSLT+SPARQL: Scripting the Semantic Web with SPARQL embedded into XSLT stylesheets</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Diego Berrueta</string-name>
          <email>diego.berrueta@fundacionctic.org</email>
          <xref ref-type="aff" rid="aff2">2</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Jose E. Labra</string-name>
          <email>labra@uniovi.es</email>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Ivan Herman</string-name>
          <email>Ivan.Herman@cwi.nl</email>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>Centre for Mathematics and Computer Sciences (CWI) Amsterdam</institution>
          ,
          <country country="NL">the Netherlands</country>
        </aff>
        <aff id="aff1">
          <label>1</label>
          <institution>Departamento de InformÆtica Universidad de Oviedo</institution>
          ,
          <country country="ES">Spain</country>
        </aff>
        <aff id="aff2">
          <label>2</label>
          <institution>Fundacin CTIC Gijn</institution>
          ,
          <country country="ES">Spain</country>
        </aff>
      </contrib-group>
      <abstract>
        <p>Scripting the Semantic Web requires to access and transform RDF data. We present XSLT+SPARQL, a set of extension functions for XSLT which allow stylesheets to directly access RDF data, independently of any serialization syntax, by means of SPARQL queries. Using these functions, XSLT stylesheets can retrieve, query, merge and transform data from the semantic web. We illustrate the functionality of our proposal with an example script which creates XHTML pages from the contents of DBpedia.</p>
      </abstract>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>-</title>
      <p>
        The semantic web has adopted RDF as its preferred data model for resource
description. However, the document web is based on markup languages like XML
and HTML. Transforming data and gluing between the two worlds with the
current set of tools is not always easy. In particular, XSLT [
        <xref ref-type="bibr" rid="ref16">16</xref>
        ] and the newer
XQuery [
        <xref ref-type="bibr" rid="ref10">10</xref>
        ] have been around since 1999 and 2007 respectively, and they oer
excellent functionality to query and transform XML documents into other
formats. Although they do not directly produce RDF data, indeed they can output
RDF serialized in RDF/XML or N3.
      </p>
      <p>However, the inverse transformation, from RDF to XML, is insuciently
covered by the current tool set. Most popular web scripting languages, such as
Python and PHP, have their own non-standard APIs for accessing RDF data
(conversely, there are standardized APIs for XML, such as DOM and SAX).
This is an hindrance to the use of these scripting languages with RDF.</p>
      <p>
        Unfortunately, standard languages such as XSLT and XQuery are
inappropriate for this task. Even if RDF data can be apparently addressed as XML through
its RDF/XML serialization syntax [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ], a second analysis reveals that this is only
possible in a very controlled environment in which the serialization is specially
produced under certain constraints, or normalized in a previous step [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ].
      </p>
      <p>We propose XSLT+SPARQL, an extension to the XSLT function set to
embed SPARQL SELECT and ASK queries in the XPath selection expressions.
This makes it possible to process RDF data directly within the RDF model, i.e.,
regardless of any particular serialization syntax. We believe XSLT+SPARQL can
contribute to the semantic web by providing a new platform for scripting and
transforming RDF into XML, which is often the last processing step of many
semantic web scripts. XSLT+SPARQL can easily produce XHTML reports, SVG
graphs, SOAP messages or, more generally, any valid XSLT output format (XML
or text documents). Moreover, developers can exploit the expressivity of XSLT
to create complex scripts that combine, lter and transform data retrieved from
dierent web sources or even from remote SPARQL endpoints.</p>
      <p>The rest of the paper is organized as follows. Next section examines related
work prior to the description of XSLT+SPARQL in Section 3. Implementation
is briey discussed in Section 4, and a use case is presented in Section 5. The
discussion in Section 6 concludes the paper.
2</p>
    </sec>
    <sec id="sec-2">
      <title>Related work</title>
      <p>
        After a number of proposals from dierent groups [
        <xref ref-type="bibr" rid="ref15">15</xref>
        ], W3C nally came with
SPARQL [
        <xref ref-type="bibr" rid="ref17">17</xref>
        ], a exible query language for RDF. There are two companion
specications: the query protocol [
        <xref ref-type="bibr" rid="ref13">13</xref>
        ] and a XML Schema to represent the
results [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ]. Many have observed that the latter makes SPARQL results tractable
with XSLT stylesheets in order to generate XML (XHTML, RSS...) from RDF
data. This approach is indeed useful for simple tasks, where a single SPARQL
query is enough to extract all the relevant data from an RDF graph, but it falls
short for complex transformations. Nevertheless, this technique has been
suggested as a mechanism to implement the lowering operation of semantic web
services grounding (cf. section 4.2 of [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ]).
      </p>
      <p>
        The most direct precedent to our work is [
        <xref ref-type="bibr" rid="ref19">19</xref>
        ]. The authors of the Topia
project introduce a multi-stage processing architecture that consumes RDF and
XML data with XSLT stylesheets. They use XSLT extension functions to query
a Sesame RDF repository [
        <xref ref-type="bibr" rid="ref11">11</xref>
        ] using RDQL [
        <xref ref-type="bibr" rid="ref18">18</xref>
        ], RQL and SeRQL, three RDF
query languages which preceded in time to SPARQL. In this sense, our work is
an updated version of theirs, but in addition to the change of the language, there
are other dierences. Our queries return binding tables (for SELECT queries)
or just Boolean results (for ASK queries), while Topia queries return sub-graphs
(sets of triples) serialized in XML.
      </p>
      <p>
        More recently, XSPARQL [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ] has been proposed to unify SPARQL and
XQuery in a single language that extends both of them. XQuery and XSLT
are W3C recommendations with an important overlap in their functionality.
XSPARQL is built on top of the XQuery syntax and semantics. On the other
hand, XSLT+SPARQL retains the XSLT syntax and processing model and
exploits the extensibility of the XPath function set. The two proposals transform
between RDF and XML in both directions, and both can read and produce RDF
serialized in dierent syntaxes (Turtle or RDF/XML).
      </p>
    </sec>
    <sec id="sec-3">
      <title>Description of XSLT+SPARQL</title>
      <p>XSLT+SPARQL exploits the extensibility mechanism provided by the host
language, to introduce a number of extension functions. They are grouped in two
dierent namespaces.
3.1</p>
      <sec id="sec-3-1">
        <title>Basic query functions</title>
        <p>The core functionality of XSLT+SPARQL is provided by just two functions:</p>
      </sec>
      <sec id="sec-3-2">
        <title>1. sparql:sparql(query [, documentUrl, ...])</title>
        <p>2. sparql:sparqlEndpoint(query, endpointUrl)</p>
        <p>These functions execute a SELECT or ASK query (CONSTRUCT and
DESCRIBE queries are not allowed because they return RDF/XML documents,
which are notoriously dicult to handle in XSLT). The rst function executes
the query locally, while the second one sends a request to a remote SPARQL
endpoint and retrieves the results. The documents pointed by the (potentially
empty) list of URLs are merged with the ones referred by the FROM clauses
of the query to create the default graph.
3.2</p>
      </sec>
      <sec id="sec-3-3">
        <title>Advanced functions</title>
        <p>Some applications may need to eciently execute multiple queries against the
same dataset, or even to build custom datasets by merging multiple graphs.
To address the requirements of these applications, a second set of extension
functions is dened in a dierent namespace:
1. sparqlModel:parseString(serializedRdf [, serializationSyntax])
2. sparqlModel:readModel(documentUrl [, serializationSyntax])
3. sparqlModel:readModel(nodeset)
4. sparqlModel:mergeModels(firstModel, secondModel, ...)
5. sparqlModel:sparqlModel(query, model)</p>
        <p>
          The rst three functions read RDF data from dierent sources: (1) a string;
(2) a document pointed by a URL; or (3) any fragment of the XSLT input tree,
the result tree only in XSLT 2.0 or even the XSLT stylesheet itself. When
the input is a string or a web document, an optional parameter selects the
RDF serialization syntax to be parsed (N3 [
          <xref ref-type="bibr" rid="ref7">7</xref>
          ], Turtle, RDF/XML, GRDDL [
          <xref ref-type="bibr" rid="ref14">14</xref>
          ],
RDFa [
          <xref ref-type="bibr" rid="ref1">1</xref>
          ]). These three functions return a handler for an in-memory local RDF
model that can be used in the next functions.
        </p>
        <p>The mergeModels function combines any number of input models into a new
one. Due to the functional character of XSLT, it is not possible to do in-place
modications of a model, therefore this function returns a new model with the
result of combining the data. Consequently, scripts that require to merge data
from a sequence of sources cannot iterate through the sequence, but have to
be re-casted as recursive templates using well-known patterns from functional
programming.</p>
        <p>Finally, the fth function executes a SPARQL query over an in-memory
model. Any FROM or FROM NAMED clause in the query is ignored.</p>
        <p>Together, these advanced functions bring great exibility to the developer,
and also a performance boost to execute multiple queries against the same
dataset, avoiding the need for repeated parsing of the input documents.
4</p>
      </sec>
    </sec>
    <sec id="sec-4">
      <title>Implementation</title>
      <p>
        We have implemented the above functions in Java as an extension for Apache
Xalan4, an open-source XSLT processor, although it should be easy to adapt
our code to other XSLT processors. Our implementation uses the Jena
framework [
        <xref ref-type="bibr" rid="ref12">12</xref>
        ] to manage RDF documents, and to execute queries locally and
remotely. We note that a pure XSLT implementation of sparql:sparqlEndpoint
is also possible using the document function of XSLT. However, due to the lack
of control on how that function performs HTTP content negotiation, the pure
XSLT implementation may be unable to query some endpoints notably,
DBpedia’s endpoint when certain XSLT processors are used. On the other hand, our
Java-based implementation can manage content negotiation to retrieve RDF or
XML documents as needed, therefore it can access the Linked Data web [
        <xref ref-type="bibr" rid="ref8 ref9">8,9</xref>
        ].
      </p>
      <p>A limitation of our current implementation concerns the sparql:sparql and
sparqlModel:mergeModels functions, which do not accept an arbitrary number
of arguments, due to the inability of Xalan 2.7 to access Java5 vararg methods
using reectivity. Particularly, the former accepts zero or one document URLs,
and the latter merges exactly two models.
5</p>
    </sec>
    <sec id="sec-5">
      <title>Use case: DBpedia to XHTML</title>
      <p>
        Practical use of XSLT+SPARQL is demonstrated by a sample script (Figure 1)
that extracts data from DBpedia [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ] and creates a simple report in XHTML.
The stylesheets contains only two templates. The rst one eciently accesses
DBpedia data through its public SPARQL endpoint (i.e, the script does not
retrieve the RDF dataset, but just the results of the query in XML format).
The second one generates XHTML mark-up for each row of the results bindings
table.
      </p>
      <p>The functionality of XSLT+SPARQL goes far beyond this small example.
More complex examples can be found in the project web page 5.
6</p>
    </sec>
    <sec id="sec-6">
      <title>Conclusions and future work</title>
      <p>We presented XSLT+SPARQL, a simple extension for XSLT to embed SPARQL
queries in XPath expressions, making it possible to process RDF data from</p>
      <sec id="sec-6-1">
        <title>4 http://xml.apache.org/xalan-j/</title>
        <p>5 http://berrueta.net/research/xsltsparql
&lt;xsl:variable name="query"&gt;</p>
        <p>PREFIX skos: &amp;lt;http://www.w3.org/2004/02/skos/core#&amp;gt;
PREFIX cat: &amp;lt;http://dbpedia.org/resource/Category:&amp;gt;
PREFIX rdfs: &amp;lt;http://www.w3.org/2000/01/rdf-schema#&amp;gt;
PREFIX foaf: &amp;lt;http://xmlns.com/foaf/0.1/&amp;gt;
SELECT ?name ?person ?img
WHERE { ?person skos:subject cat:Spanish_actors .</p>
        <p>?person rdfs:label ?name .
?person foaf:depiction ?img .</p>
        <p>FILTER (lang(?name)="es") }</p>
        <p>ORDER BY ?name
&lt;/xsl:variable&gt;
&lt;xsl:template match="/"&gt;
&lt;html&gt; &lt;body&gt;
&lt;h1&gt;Spanish Actors&lt;/h1&gt;
&lt;ul&gt;
&lt;xsl:apply-templates select="sparql:sparqlEndpoint(</p>
        <p>$query, ’http://dbpedia.org/sparql’)"/&gt;
&lt;/ul&gt;
&lt;/body&gt; &lt;/html&gt;
&lt;/xsl:template&gt;
&lt;xsl:template match="results:result"&gt;
&lt;li&gt;
&lt;xsl:value-of select="results:binding[@name=’name’]"/&gt;
&lt;img&gt; &lt;xsl:attribute name="src"&gt;</p>
        <p>&lt;xsl:value-of select="results:binding[@name=’img’]"/&gt;
&lt;/xsl:attribute&gt; &lt;/img&gt;
&lt;/li&gt;
&lt;/xsl:template&gt;</p>
        <p>XSLT stylesheets without bothering with the tricky RDF/XML serialization.
XSLT+SPARQL is a new standards-based platform to write declarative scripts
for the semantic web. It is straightforward to use for developers experienced in
XML and RDF technologies because it does not require to learn a new language
or processing model. Furthermore, it can be implemented by re-using current
XSLT processors.</p>
        <p>The usage of XSLT+SPARQL has been illustrated by means of a sample
application to create XHTML reports from DBpedia data. We envisage the
usage of XSLT+SPARQL in a wide variety of scenarios. They mainly involve
transforming RDF data into other formats which are more suitable for human
consumption. However, more complex semantic web agents can be developed
as well. For instance, we are working on a semantic web crawler/browser that
collects relevant information about a subject from dierent linked data sources
and creates a comprehensive report in XHTML.</p>
        <p>We are also considering new additions to the current set of functions. One
area of particular interest would be to add support for RDFS and OWL
reasoning.</p>
      </sec>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          1.
          <string-name>
            <given-names>B.</given-names>
            <surname>Adida</surname>
          </string-name>
          and
          <string-name>
            <given-names>M.</given-names>
            <surname>Birbeck</surname>
          </string-name>
          .
          <source>RDFa primer 1</source>
          .0. Working draft, W3C,
          <year>March 2007</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          2.
          <string-name>
            <given-names>W.</given-names>
            <surname>Akhtar</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Kopecky</surname>
          </string-name>
          ,
          <string-name>
            <given-names>T.</given-names>
            <surname>Krennwallner</surname>
          </string-name>
          ,
          <article-title>and</article-title>
          <string-name>
            <given-names>A.</given-names>
            <surname>Polleres</surname>
          </string-name>
          . XSPARQL:
          <article-title>Traveling between the XML and RDF worlds and avoiding the XSLT pilgrimage</article-title>
          .
          <source>Technical Report 2007-12-14</source>
          ,
          <string-name>
            <given-names>DERI</given-names>
            <surname>Galway</surname>
          </string-name>
          ,
          <year>2007</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          3.
          <string-name>
            <given-names>R.</given-names>
            <surname>Akkiraju</surname>
          </string-name>
          and
          <string-name>
            <given-names>B.</given-names>
            <surname>Sapkota</surname>
          </string-name>
          .
          <article-title>Semantic annotations for WSDL and XML schema - usage guide</article-title>
          . Working group note,
          <source>W3C</source>
          ,
          <year>2007</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          4.
          <string-name>
            <given-names>S.</given-names>
            <surname>Auer</surname>
          </string-name>
          ,
          <string-name>
            <given-names>C.</given-names>
            <surname>Bizer</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Lehmann</surname>
          </string-name>
          , G. Kobilarov,
          <string-name>
            <given-names>R.</given-names>
            <surname>Cyganiak</surname>
          </string-name>
          , and
          <string-name>
            <surname>Z. Ives.</surname>
          </string-name>
          <article-title>DBpedia: A nucleus for a web of open data</article-title>
          .
          <source>In International Semantic Web Conference</source>
          ,
          <year>2007</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          5.
          <string-name>
            <given-names>D.</given-names>
            <surname>Beckett</surname>
          </string-name>
          .
          <article-title>RDF/XML syntax specication (revised)</article-title>
          .
          <source>Recommendation, W3C</source>
          ,
          <year>February 2004</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          6.
          <string-name>
            <given-names>D.</given-names>
            <surname>Beckett</surname>
          </string-name>
          and
          <string-name>
            <surname>J. Broekstra.</surname>
          </string-name>
          <article-title>SPARQL query results XML format</article-title>
          . Recommendation, W3C,
          <year>January 2008</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          7.
          <string-name>
            <surname>T.</surname>
          </string-name>
          Berners-Lee.
          <article-title>Notation 3</article-title>
          . Available at http://www.w3.org/DesignIssues/ Notation3.html,
          <year>1998</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          8.
          <string-name>
            <given-names>D.</given-names>
            <surname>Berrueta</surname>
          </string-name>
          and
          <string-name>
            <given-names>J.</given-names>
            <surname>Phipps</surname>
          </string-name>
          .
          <article-title>Best practice recipes for publishing RDF vocabularies</article-title>
          .
          <source>Working draft, W3C</source>
          ,
          <year>2007</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          9.
          <string-name>
            <given-names>C.</given-names>
            <surname>Bizer</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R.</given-names>
            <surname>Cyganiak</surname>
          </string-name>
          , and
          <string-name>
            <given-names>T.</given-names>
            <surname>Heath</surname>
          </string-name>
          .
          <article-title>How to publish linked data on the web?</article-title>
          ,
          <year>Jul 2007</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          10.
          <string-name>
            <given-names>S.</given-names>
            <surname>Boag</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D.</given-names>
            <surname>Chamberlin</surname>
          </string-name>
          ,
          <string-name>
            <surname>M. F. FernÆndez</surname>
            ,
            <given-names>D.</given-names>
          </string-name>
          <string-name>
            <surname>Florescu</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          <string-name>
            <surname>Robie</surname>
          </string-name>
          , and J.
          <source>SimØon. XQuery 1</source>
          .0:
          <string-name>
            <surname>An</surname>
            <given-names>XML</given-names>
          </string-name>
          <article-title>query language</article-title>
          .
          <source>Recommendation, W3C</source>
          ,
          <year>2007</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          11.
          <string-name>
            <surname>J. Broekstra</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          <string-name>
            <surname>Kampman</surname>
            , and
            <given-names>F. van Harmelen. Sesame:</given-names>
          </string-name>
          <article-title>A generic architecture for storing and querying RDF</article-title>
          . In International Semantic Web Conference ,
          <year>2002</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          12.
          <string-name>
            <surname>J. J. Carroll</surname>
            , I. Dickinson,
            <given-names>C.</given-names>
          </string-name>
          <string-name>
            <surname>Dollin</surname>
            ,
            <given-names>D.</given-names>
          </string-name>
          <string-name>
            <surname>Reynolds</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          <string-name>
            <surname>Seaborne</surname>
            , and
            <given-names>K.</given-names>
          </string-name>
          <string-name>
            <surname>Wilkinson</surname>
          </string-name>
          .
          <article-title>Jena: implementing the semantic web recommendations</article-title>
          .
          <source>In 13th international World Wide Web conference Alternate track papers</source>
          ,
          <year>2004</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          13.
          <string-name>
            <surname>K. G.</surname>
          </string-name>
          <article-title>Clark. SPARQL protocol for RDF</article-title>
          . Recommendation, W3C,
          <year>January 2008</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          14.
          <string-name>
            <given-names>D.</given-names>
            <surname>Connolly</surname>
          </string-name>
          .
          <article-title>Gleaning Resource Descriptions from Dialects of Languages (GRDDL)</article-title>
          . Recommendation, W3C,
          <year>September 2007</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref15">
        <mixed-citation>
          15.
          <string-name>
            <given-names>P.</given-names>
            <surname>Haase</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Broekstra</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Eberhart</surname>
          </string-name>
          , and
          <string-name>
            <given-names>R.</given-names>
            <surname>Volz</surname>
          </string-name>
          .
          <article-title>A comparison of RDF query languages</article-title>
          .
          <source>In Third International Semantic Web Conference</source>
          , Hiroshima, Japan ,
          <year>2004</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref16">
        <mixed-citation>
          16.
          <string-name>
            <surname>M.</surname>
          </string-name>
          <article-title>Kay. XSL transformations (XSLT) version 2.0</article-title>
          . Recommendation, W3C,
          <year>2007</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref17">
        <mixed-citation>
          17. E.
          <string-name>
            <surname>Prud</surname>
          </string-name>
          <article-title>'hommeaux and</article-title>
          <string-name>
            <given-names>A.</given-names>
            <surname>Seaborne</surname>
          </string-name>
          .
          <article-title>SPARQL query language for RDF</article-title>
          . Recommentation, W3C,
          <year>January 2008</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref18">
        <mixed-citation>
          18.
          <string-name>
            <given-names>A.</given-names>
            <surname>Seaborne. RDQL -</surname>
          </string-name>
          <article-title>a query language for RDF. Member submission, W3C</article-title>
          ,
          <year>January 2004</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref19">
        <mixed-citation>
          19.
          <string-name>
            <surname>J. van Ossenbruggen</surname>
            ,
            <given-names>L.</given-names>
          </string-name>
          <string-name>
            <surname>Hardman</surname>
            , and
            <given-names>L.</given-names>
          </string-name>
          <string-name>
            <surname>Rutledge</surname>
          </string-name>
          .
          <article-title>Towards smart style: combining RDF semantics with XML document transformations</article-title>
          .
          <source>Technical Report INSE0303</source>
          , CWI,
          <year>October 2003</year>
          .
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>