This document provides some examples of useful XPath expressions which can be used to process treetriples.
<!-- NOTE this expression is guaranteed to only return one node --> <xsl:for-each select="/tt:rdf/tt:s[@id = 'http://example.com/thing']"> ... </xsl:for-each>
<xsl:for-each select="/tt:rdf/tt:s[@id = 'http://example.com/thing']"> <h1> <xsl:value-of select="tt:p[@id = '&dc;title']/tt:o" /> </h1> <p> <xsl:value-of select="tt:p[@id = '&dc;description]/tt:o" /> </p> </xsl:for-each>
<xsl:for-each select="/tt:rdf/tt:s[tt:p[@id = '&rdf;type' and tt:o/@id = '&foaf;Person' ]]">
...
</xsl:for-each>
This technique can also be used anywhere where it is necessary to find the subject of a triple where the predicate and/or object are known.
<xsl:for-each select="/tt:rdf/tt:s[@id = 'http://example.com/thing']"> <ul> <xsl:for-each select="tt:p[@id = '&foaf:knows']/tt:o" /> <xsl:variable name="ref" select="@id" /> <li> <!-- use [1] as we are only interested in the first nickname --> <xsl:value-of select="/tt:rdf/tt:s[@id = $ref]/tt:p[@id = '&foaf;nick']/tt:o[1]"> </li> </xsl:for-each> </ul> </xsl:for-each>
...or, more concisely:
<xsl:for-each select="/tt:rdf/tt:s[@id = 'http://example.com/thing']"> <ul> <xsl:for-each select="tt:p[@id = '&foaf:knows']/tt:o" /> <li> <xsl:value-of select="/tt:rdf/tt:s[@id = current()/@id]/tt:p[@id = '&foaf;nick']/tt:o[1]"> </li> </xsl:for-each> </ul> </xsl:for-each>
<xsl:variable name="list" select="/tt:rdf/tt:s[@id = 'http://example.com/feed' and tt:p[@id = '&rss;items']]/tt:o" /> <xsl:for-each select="/tt:rdf/tt:d[@id = $list and @parse = 'seq']/tt:o"> <xsl:for-each select="/tt:rdf/tt:s[@id = current()/@id]"> ... </xsl:for-each /> </xsl:for-each>
<xsl:variable name="list" select="/tt:rdf/tt:s[@id = 'http://example.com/feed' and tt:p[@id = '&rss;items']]/tt:o" />
<xsl:for-each select="/tt:rdf/tt:d[@id = $list and @parse = 'seq']/tt:o">
<xsl:sort data-type="number" select="position()" order="descending" />
<xsl:for-each select="/tt:rdf/tt:s[@id = current()/@id]">
...
</xsl:for-each />
</xsl:for-each>
<xsl:for-each select="/tt:rdf/tt:s[@id = 'http://example.com/thing']"> <xsl:value-of select="tt:p[@id = '&dc;title']/tt:o[@xml:lang = 'en']" /> </xsl:for-each>
<xsl:for-each select="/tt:rdf/tt:s[@id = 'http://example.com/thing']"> <xsl:value-of disable-output-escaping="yes" select="tt:p[@id = '&atomrdf;xmlContent']/tt:o/node()" /> </xsl:for-each>
Use xsl-for-each to set the context to a tt:s node, and then work from there.
Use square brackets [] to select predicates that match your criteria. You may need to nest square brackets.