730 likes | 889 Views
XSLT. Processing XML using XSLT Using XPath Escaping to Java. Processing XML using XSLT. Instructions for dowloading Xalan can be found in Lab 2. The following programs were tested with the command line C:>xalan somefile.xml somefile.xsl resultfile.html
E N D
XSLT • Processing XML using XSLT • Using XPath • Escaping to Java Internet Technologies
Processing XML using XSLT Instructions for dowloading Xalan can be found in Lab 2. The following programs were tested with the command line C:>xalan somefile.xml somefile.xsl resultfile.html The Xalan classes (and xslt processing) may also be accessed via a servlet or Java application (see Lab 2). Internet Technologies
<?xml version="1.0" ?> <?xml-stylesheet type="text/xsl" href="demo1.xsl"?> <book> <title>The Catcher in the Rye</title> <author>J. D. Salinger</author> <publisher>Little, Brown and Company</publisher> </book> Input Internet Technologies
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match = "book"> <HTML><BODY><xsl:apply-templates/></BODY></HTML> </xsl:template> <xsl:template match = "title"> <H1><xsl:apply-templates/></H1> </xsl:template> <xsl:template match = "author"> <H3><xsl:apply-templates/></H3> </xsl:template> <xsl:template match = "publisher"> <P><I><xsl:apply-templates/></I></P> </xsl:template> </xsl:stylesheet> Processing Internet Technologies
<HTML> <BODY> <H1>The Catcher in the Rye</H1> <H3>J. D. Salinger</H3> <P> <I>Little, Brown and Company</I> </P> </BODY> </HTML> Output Internet Technologies
<?xml version="1.0" ?> <?xml-stylesheet type="text/xsl" href="demo1.xsl"?> <library> <block> <book> <title>The Catcher in the Rye</title> <author>J. D. Salinger</author> <publisher>Little, Brown and Company</publisher> </book> </block> </library> Input Internet Technologies
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match = "book"> <HTML><BODY><xsl:apply-templates/></BODY></HTML> </xsl:template> <xsl:template match = "title"> <H1><xsl:apply-templates/></H1> </xsl:template> <xsl:template match = "author"> <H3><xsl:apply-templates/></H3> </xsl:template> <xsl:template match = "publisher"> <P><I><xsl:apply-templates/></I></P> </xsl:template> </xsl:stylesheet> The default rules matches the root, library and block elements. Internet Technologies
<HTML> <BODY> <H1>The Catcher in the Rye</H1> <H3>J. D. Salinger</H3> <P> <I>Little, Brown and Company</I> </P> </BODY> </HTML> The output is the same. Internet Technologies
<?xml version="1.0" ?> <?xml-stylesheet type="text/xsl" href="demo1.xsl"?> <book> <title>The Catcher in the Rye</title> <author>J. D. Salinger</author> <publisher>Little, Brown and Company</publisher> <book>Cliff Notes on The Catcher in the Rye</book> </book> Two books in the input Internet Technologies
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match = "book"> <HTML><BODY><xsl:apply-templates/></BODY></HTML> </xsl:template> <xsl:template match = "title"> <H1><xsl:apply-templates/></H1> </xsl:template> <xsl:template match = "author"> <H3><xsl:apply-templates/></H3> </xsl:template> <xsl:template match = "publisher"> <P><I><xsl:apply-templates/></I></P> </xsl:template> </xsl:stylesheet> What’s the output? Internet Technologies
<HTML> <BODY> <H1>The Catcher in the Rye</H1> <H3>J. D. Salinger</H3> <P> <I>Little, Brown and Company</I> </P> <HTML> <BODY>Cliff Notes on The Catcher in the Rye</BODY> </HTML> </BODY> </HTML> Illegal HTML Internet Technologies
<?xml version="1.0" ?> <?xml-stylesheet type="text/xsl" href="demo1.xsl"?> <book> <title>The Catcher in the Rye</title> <author>J. D. Salinger</author> <publisher>Little, Brown and Company</publisher> </book> Input Internet Technologies
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match = "book"> <HTML><BODY><xsl:apply-templates/></BODY></HTML> </xsl:template> <xsl:template match = "title"> <H1><xsl:apply-templates/></H1> </xsl:template> <xsl:template match = "author"> <H3><xsl:apply-templates/></H3> </xsl:template> <!-- <xsl:template match = "publisher"> <P><I><xsl:apply-templates/></I></P> </xsl:template> --> </xsl:stylesheet> We are not matching on publisher. Internet Technologies
<HTML> <BODY> <H1>The Catcher in the Rye</H1> <H3>J. D. Salinger</H3> Little, Brown and Company </BODY> </HTML> We get the default rule matching the publisher and then printing its child. Internet Technologies
<?xml version="1.0" ?> <?xml-stylesheet type="text/xsl" href="demo1.xsl"?> <book> <title>The Catcher in the Rye</title> <author>J. D. Salinger</author> <publisher>Little, Brown and Company</publisher> </book> Input Internet Technologies
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match = "book"> <HTML><BODY><xsl:apply-templates/></BODY></HTML> </xsl:template> <xsl:template match = "title"> <H1><xsl:apply-templates/></H1> </xsl:template> <xsl:template match = "author"> <H3><xsl:apply-templates/></H3> </xsl:template> <xsl:template match = "publisher"> <!-- Skip the publisher --> </xsl:template> </xsl:stylesheet> We can skip the publisher by matching and stopping the recursion. Internet Technologies
<HTML> <BODY> <H1>The Catcher in the Rye</H1> <H3>J. D. Salinger</H3> </BODY> </HTML> Internet Technologies
<?xml version="1.0" ?> <?xml-stylesheet type="text/xsl" href="demo1.xsl"?> <shelf> <book> <title>The Catcher in the Rye</title> <author>J. D. Salinger</author> <publisher>Little, Brown and Company</publisher> </book> <book> <title>The Catcher in the Rye</title> <author>J. D. Salinger</author> <publisher>Little, Brown and Company</publisher> </book> <book> <title>The Catcher in the Rye</title> <author>J. D. Salinger</author> <publisher>Little, Brown and Company</publisher> </book> </shelf> A shelf has many books. Internet Technologies
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match = "book"> <HTML><BODY><xsl:apply-templates/></BODY></HTML> </xsl:template> <xsl:template match = "title"> <H1><xsl:apply-templates/></H1> </xsl:template> <xsl:template match = "author"> <H3><xsl:apply-templates/></H3> </xsl:template> <xsl:template match = "publisher"> <i><xsl:apply-templates/></i> </xsl:template> </xsl:stylesheet> Will this do the job? Internet Technologies
<HTML> <BODY> <H1>The Catcher in the Rye</H1> <H3>J. D. Salinger</H3> <i>Little, Brown and Company</i> </BODY> </HTML> <HTML> <BODY> <H1>The Catcher in the Rye</H1> <H3>J. D. Salinger</H3> <i>Little, Brown and Company</i> </BODY> </HTML> <HTML> <BODY> <H1>The Catcher in the Rye</H1> <H3>J. D. Salinger</H3> <i>Little, Brown and Company</i> </BODY> </HTML> This is not what we want. Internet Technologies
<?xml version="1.0" ?> <?xml-stylesheet type="text/xsl" href="demo1.xsl"?> <shelf> <book> <title>The Catcher in the Rye</title> <author>J. D. Salinger</author> <publisher>Little, Brown and Company</publisher> </book> <book> <title>The Catcher in the Rye</title> <author>J. D. Salinger</author> <publisher>Little, Brown and Company</publisher> </book> <book> <title>The Catcher in the Rye</title> <author>J. D. Salinger</author> <publisher>Little, Brown and Company</publisher> </book> </shelf> Same input. Internet Technologies
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match = "shelf"> <HTML><BODY>Found a shelf</BODY></HTML> </xsl:template> </xsl:stylesheet> Checks for a shelf and quits. Internet Technologies
<HTML> <BODY>Found a shelf</BODY> </HTML> Output Internet Technologies
<?xml version="1.0" ?> <?xml-stylesheet type="text/xsl" href="demo1.xsl"?> <shelf> <book> <title>The Catcher in the Rye</title> <author>J. D. Salinger</author> <publisher>Little, Brown and Company</publisher> </book> <book> <title>The Catcher in the Rye</title> <author>J. D. Salinger</author> <publisher>Little, Brown and Company</publisher> </book> <book> <title>The Catcher in the Rye</title> <author>J. D. Salinger</author> <publisher>Little, Brown and Company</publisher> </book> </shelf> Same input. Internet Technologies
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match = "shelf"> <HTML> <BODY> <b>These are a few of my favorite books</b> <table width = "640“ border = “5”> <xsl:apply-templates/> </table> </BODY> </HTML> </xsl:template> <xsl:template match = "book"> <tr> <td> <xsl:number/> </td> <xsl:apply-templates/> </tr> </xsl:template> <xsl:template match = "title | author | publisher"> <td><xsl:apply-templates/></td> </xsl:template> </xsl:stylesheet> Produce a table of books. Internet Technologies
<HTML> <BODY> <b>These are a few of my favorite books</b> <table width="640“ border = “5”> <tr> <td>1</td> <td>The Catcher in the Rye</td> <td>J. D. Salinger</td> <td>Little, Brown and Company</td> </tr> <tr> <td>2</td> <td>The XSLT Programmer's Reference</td> <td>Michael Kay</td> <td>Wrox Press</td> </tr> <tr> <td>3</td> <td>Computer Organization and Design</td> <td>Patterson and Henessey</td> <td>Morgan Kaufmann</td> </tr> </table> </BODY> </HTML> Internet Technologies
XPATH • Non-xml language used to identify particular parts • of an xml document • Used by XSLT for matching and selecting particular • elements to be copied into the result tree. • Used by Xpointer to identify a particular point in or part • of an xml document that an Xlink links to. • Slides adapted from “XML in a Nutshell” by Harold Internet Technologies
XPATH First, we’ll look at three commonly used XSLT instructions: xsl:value-of xsl:template xsl:apply-templates Internet Technologies
XPATH <xsl:value-of select = “XPathExpression” /> The xsl:value-of element computes the string value of an Xpath expression and inserts it into the result tree. XPath allows us to select nodes in the tree and different node types produce different values. Internet Technologies
XPATH <xsl:value-of select = “XPathExpression” /> element => the text content of the element after all tags are stripped text => the text of the node attribute => the value of the attribute root => the value of the root processing-instruction => the processing instruction data (<?, ?>, and the target are not included comment => the text of the comment (no comment symbols) namespace => the namespace URI node set => the value of the first node in the set Internet Technologies
XPATH <xsl:template match = “pattern” /> The xsl:template top-level element is the key to all of xslt. The match attribute contains a pattern (location path) against which nodes are compared as they’re processed. If the pattern matches a node, then the contents are instantiated Internet Technologies
XPATH <xsl:apply-templates select = “XPath node set expression” /> Find and apply the highest priority template that matches the node set expression. If the select attribute is not present then all children of the context node are processed. Internet Technologies
The Tree Structure of an XML Document See Harold Pg. 147 <?xml version="1.0" ?> <?xml-stylesheet type="text/xsl" href = "pi.xsl" ?> <people> <person born="1912" died = "1954" id="p342"> <name> <first_name>Alan</first_name> <last_name>Turing</last_name> </name> <!-- Did the word "computer scientist" exist in Turing's day? --> <profession>computer scientist</profession> <profession>mathematician</profession> <profession>cryptographer</profession> </person> Internet Technologies
<person born="1918" died = "1988" id="p4567"> <name> <first_name>Richard</first_name> <middle_initial>M</middle_initial> <last_name>Feynman</last_name> </name> <profession>physicist</profession> <hobby>Playing the bongoes</hobby> </person> </people> Unicode ‘M’ Internet Technologies
/ <?xml-stylesheet type="text/xsl" href = “some.xsl" ?> born = “1914” person person died = “1952” id=“p342” name profession <!– Did the word “computer scientist” exist in Turing’s day?”-- > first_name Alan Internet Technologies
Nodes seen by XPath Constructs not seen by XPath The root Element Nodes Text Nodes Attribute Nodes Comment Nodes Processing Instructions Namespace Nodes CDATA sections Entity references Document Type Declarations Internet Technologies
Note The following appears in each example below so it has been removed from the slides. <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" > : : </xsl:stylesheet> Internet Technologies
Location Paths • The root <xsl:template match="/"> <a>matched the root</a> </xsl:template> <?xml version="1.0" encoding="utf-8"?> <a>matched the root</a> Internet Technologies
Location Paths • Child element location paths (relative to context node) <xsl:template match="/"> <xsl:value-of select = "people/person/profession" /> </xsl:template> computer scientist Internet Technologies
Location Paths • Attribute location paths (relative to context node) <xsl:template match="/"> <xsl:value-of select = "people/person/@born" /> </xsl:template> <?xml version="1.0" encoding="utf-8"?> 1912 Internet Technologies
Location Paths • Attribute location paths (relative to context node) <xsl:template match="/"> <xsl:apply-templates select = "people/person" /> </xsl:template> <xsl:template match = "person"> <date> <xsl:value-of select = "@born" /> </date> </xsl:template> <date>1912</date><date>1918</date> Internet Technologies
Location Paths • Comment Location Step (comments don’t have names) <xsl:template match="/"> <xsl:value-of select = "people/person/comment()" /> </xsl:template> <?xml version="1.0" encoding="utf-8"?> Did the word "computer scientist" exist in Turing's day? Internet Technologies
Location Paths • Comment Location Step <xsl:template match = "comment()" > <i>comment deleted</i> </xsl:template> Document content with comments replaced as shown. Default – no comments output Internet Technologies
Location Paths • Text Location Step (Text nodes don’t have names) <xsl:template match="/"> <xsl:value-of select = "people/person/profession/text()" /> </xsl:template> computer scientist Internet Technologies
Location Paths • Processing Instruction Location Step <xsl:template match="/"> <xsl:value-of select = "processing-instruction()" /> </xsl:template> <?xml version="1.0" encoding="utf-8"?> type="text/xsl" href = "pi.xsl" Internet Technologies
Location Paths • Wild cards • There are three wild cards: *, node(), @* • The * matches any element node. It will not match • attributes, text nodes, comments or processing • instructions nodes. Internet Technologies
Location Paths • Matching with * • <xsl:template match = "*" > • <xsl:apply-templates select ="*" /> • </xsl:template> Matches all elements and requests calls on sub-elements only. Nothing is displayed. The text nodes are never reached. Internet Technologies
Location Paths • Matching with node() The node() wild card matches all nodes: element nodes, text nodes, attribute nodes, processing instruction nodes, namespace nodes and comment nodes. Not implemented in XT Internet Technologies
Location Paths • Matching with @* The @* wild card matches all attribute nodes. XT does not like it in an <xsl:template match ..> but likes it in an <xsl:apply-templates select=…> Internet Technologies