Using XSLT and XPath to Transform XML Documents

Slides:



Advertisements
Similar presentations
Introduction to XSL XSL-BASIC ELEMENTS. Transforming XML XSL file 1 XSLT Processor WML fileXSL file 2HTML fileXML file Contenuto Forma Documento.
Advertisements

Advanced XSLT II. Iteration in XSLT we sometimes wish to apply the same transform to a set of nodes we iterate through a node set the node set is defined.
1 XSLT – eXtensible Stylesheet Language Transformations Modified Slides from Dr. Sagiv.
+ XSL eXtensible Stylesheet Language. + 2 XML Lecture Adapted from the work of Prof Mark Baker ACET, University of Reading.
XSLT Stylesheets Some more advanced examples (adapted from the Edinburgh LT site)
Rendering XML documents with XSL The most powerful approaches to rendering XML documents involve using XSL (eXtensible Stylesheet Language) XSL enables.
XSL Transformations (XSLT) Meghasyam Bokam April’1 st, 2002.
XSL Concepts Lecture 7. XML Display Options What can XSL Transformations do? generation of constant text suppression of content moving text (e.g., exchanging.
XSL Unit 6 November 2. XSL –eXtensible Stylesheet Language –Basically a stylesheet for XML documents XSL has three parts: –XSLT –XPath –XSL-FO.
Introduction to XSLT Transparency No. 1 Introduction to XSLT Cheng-Chia Chen.
1 Copyright (c) [2000]. Roger L. Costello. All Rights Reserved. Using XSLT and XPath to Transform XML Documents Roger L. Costello XML Technologies.
XML Language Family Detailed Examples Most information contained in these slide comes from: These slides are intended.
XML Technologies and Applications Rajshekhar Sunderraman Department of Computer Science Georgia State University Atlanta, GA 30302
1 Copyright (c) [2002]. Roger L. Costello. All Rights Reserved. Using Extension Elements and Extension Functions with XSLT and XPath Roger L. Costello.
September 15, 2003Houssam Haitof1 XSL Transformation Houssam Haitof.
17 Apr 2002 XML Stylesheets Andy Clark. What Is It? Extensible Stylesheet Language (XSL) Language for document transformation – Transformation (XSLT)
1 Copyright (c) [2002]. Roger L. Costello. All Rights Reserved. Using Extension Elements and Extension Functions with XSLT and XPath Roger L. Costello.
SD2520 Databases using XML and JQuery
Using XSLT and XPath to Enhance HTML Documents Reference: Roger L. Costello
XSLT Part 3B. id() The id() function returns a node-set containing the node or nodes with a given ID attribute. An ID attribute in this context is any.
XML for E-commerce III Helena Ahonen-Myka. In this part... n Transforming XML n Traversing XML n Web publishing frameworks.
XSL XML Stylesheet Langauage. XPath Notation for addressing elements in an XML document /xyz - selects the root element /xyz/abc - selects all elements.
Transforming XML Part II XML Document Transformation with XSLT John Arnett, MSc Standards Modeller Information and Statistics Division NHSScotland Tel:
CSE3201/CSE4500 Information Retrieval Systems XSLT – Part 2.
ECA 228 Internet/Intranet Design I XSLT Example. ECA 228 Internet/Intranet Design I 2 CSS Limitations cannot modify content cannot insert additional text.
CITA 330 Section 6 XSLT. Transforming XML Documents to XHTML Documents XSLT is an XML dialect which is declared under namespace "
Extensible Stylesheet Language Chao-Hsien Chu, Ph.D. School of Information Sciences and Technology The Pennsylvania State University XSL-FO XSLT.
XSLT part of XSL (Extensible Stylesheet Language) –includes also XPath and XSL Formatting Objects used to transform an XML document into: –another XML.
XSLT Kanda Runapongsa Dept. of Computer Engineering Khon Kaen University.
Transforming Documents „a how-to of transforming xml documents“ Lecture on Walter Kriha.
Lecture 11 XSL Transformations (part 1: Introduction)
 2002 Prentice Hall, Inc. All rights reserved. 1 Chapter 12 – XSL: Extensible Stylesheet Language Transformations (XSLT) Outline 12.1Introduction 12.2Setup.
Lecture 15 XSL Transformations (part V) Acknowledgment:
McGraw-Hill/Irwin © 2004 by The McGraw-Hill Companies, Inc. All rights reserved. Applying eXtensible Style Sheets (XSL) Ellen Pearlman Eileen Mullin Programming.
1 Copyright (c) [2000]. Roger L. Costello. All Rights Reserved. Using XSLT and XPath to Transform XML Documents Roger L. Costello XML Technologies.
More XML XPATH, XSLT CS 431 – February 23, 2005 Carl Lagoze – Cornell University.
 XSL – Extensible Style Sheet Language  XSLT – XSL Transformations › Used to transform XML documents to other formats,like HTML or other XML documents.
CSE3201/CSE4500 Information Retrieval Systems XSLT – Part 2.
University of Nottingham School of Computer Science & Information Technology Introduction to XML 2. XSLT Tim Brailsford.
XSLT: How Do We Use It? Nancy Hallberg Nikki Massaro Kauffman.
1 Whitespace Handling Roger L. Costello XML Technologies.
XML Schema – XSLT Week 8 Web site:
1 XSL Transformations (XSLT). 2 XSLT XSLT is a language for transforming XML documents into XHTML documents or to other XML documents. XSLT uses XPath.
CH 15 XSL Transformations 1. Objective What is XSL? Overview of XSL transformations Understanding XSL templates Computing the value of a node with xsl:value-of.
1 XSLT XSLT (extensible stylesheet language – transforms ) is another language to process XML documents. Originally intended as a presentation language:
Digital Media Technology
XSL Transformations (XSLT)
In this session, you will learn to:
XML Introduction Bill Jerome.
Displaying XML Data with XSLT
Using Extension Elements and Extension Functions with XSLT and XPath
Lecture XSLT.
Using XSLT and XPath to Enhance HTML Documents
XSLT Part 2.
eXtensible Stylesheet Language
XSLT 1.0.
Extensible Markup Language XML
ACG 4401 XSLT Extensible Stylesheet Language for Transformations
XSLT Instructors: Geoffrey Fox and Bryan Carpenter
Applying eXtensible Style Sheets (XSL)
XML WITH CSS.
CS 431 – February 28, 2005 Carl Lagoze – Cornell University
WHAT IS XSLT?.
XSL XSLT and XPath 24-Feb-19.
XML: eXtensible Markup Language
Attributes, Empty-Element Tags, and XSL
XSL XSLT and XPath.
More XML XML schema, XPATH, XSLT
New Perspectives on XML
7 September 1999 The Basics of XSLT Assuming a basic knowledge of XML and XML Namespaces Thomas G. Habing Grainger Engineering Library Information Center.
Presentation transcript:

Using XSLT and XPath to Transform XML Documents Roger L. Costello XML Technologies

Note All the xsl functionality that we learned in creating XSL-enhanced HTML documents are applicable in transforming XML documents

Transformation Language XSL may be used as a transformation language --> it may be used to transform an XML document into another XML document (perhaps the new one is the same, minus company sensitive data) XSL Transformation Engine (XSL Processor) XML XML

Example: Filter Gold Members <?xml version="1.0"?> <FitnessCenter> <Member id="1" level="platinum"> <Name>Jeff</Name> <Phone type="home">555-1234</Phone> <Phone type="work">555-4321</Phone> <FavoriteColor>lightgrey</FavoriteColor> </Member> <Member id="2" level="gold"> <Name>David</Name> <Phone type="home">383-1234</Phone> <Phone type="work">383-4321</Phone> <FavoriteColor>lightblue</FavoriteColor> <Member id="3" level="platinum"> <Name>Roger</Name> <Phone type="home">888-1234</Phone> <Phone type="work">888-4321</Phone> <FavoriteColor>lightyellow</FavoriteColor> </FitnessCenter> <?xml version="1.0"?> <FitnessCenter> <Member id="1" level="platinum"> <Name>Jeff</Name> <Phone type="home">555-1234</Phone> <Phone type="work">555-4321</Phone> <FavoriteColor>lightgrey</FavoriteColor> </Member> <Member id="3" level="platinum"> <Name>Roger</Name> <Phone type="home">888-1234</Phone> <Phone type="work">888-4321</Phone> <FavoriteColor>lightyellow</FavoriteColor> </FitnessCenter>

XML Transformations - all about (Template) “Rules” “Hey xsl processor, when you encounter the root element (e.g., FitnessCenter) do [action1]” “Hey xsl processor, when you encounter the Member element do [action2]” “Hey xsl processor, when you encounter the Name element do [action3]” And so forth

XML Transformations - all about (Template) “Rules” Each template rule has two parts: A pattern or matching part, that identifies the XML node in the source document to which the action part is to be applied. Matching information is contained in an attribute. An action part that details the transformation of the node

XSL Document Structure <?xml version=“1.0”?> <xsl:stylesheet> <xsl:template match=“/”> [action] </xsl:template> <xsl:template match=“FitnessCenter”> <xsl:template match=“Member”> ... </xsl:stylesheet>

Template Rules Template rules take the following general form: <xsl:template match=“pattern”> [ action ] </xsl:template>

Template Rules (Example) <xsl:template match=“Member”> <xsl:apply-templates/> </xsl:template> <xsl:template match=“Member”> “Hey XSL processor, as you parse through the XML document and you get to a <Member> element use this template rule.” <xsl:apply-templates/> “Go to each of my children (the Member children) and apply the template rules to them.”

Terminology In FitnessCenter.xml we have (snippet): <Member> <Name>Jeff</Name> <Phone type="home">555-1234</Phone> <Phone type="work">555-4321</Phone> <FavoriteColor>lightgrey</FavoriteColor> </Member> ... </FitnessCenter> “Member is a child element of the FitnessCenter element. Name, Phone, Phone, and FavoriteColor are children elements of the Member element. Member is a parent of Name. FitnessCenter and Member are ancestors of Name.”

xsl:element Suppose that you are writing a stylesheet to generate an XML document. Obviously, you will need your stylesheet to output elements. xsl:element is used to create elements <element-name> [contents of the new element] </element-name> <xsl:element name=“element-name”> [contents of the new element] </xsl:element> creates

Identity Transformation For our first example, lets create a stylesheet which simply creates an XML document that is a copy of the input XML document

<?xml version=“1.0”?> Document / PI <?xml version=“1.0”?> Element FitnessCenter ... Element Member Element Member Element Member ... ... Element Name Element Phone Element Phone Element FavoriteColor Text Jeff Text 555-1234 Text 555-4321 Text lightgrey

Cont. --> <?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="xml"/> <xsl:template match="/"> <xsl:apply-templates/> </xsl:template> <xsl:template match="FitnessCenter"> <xsl:element name="FitnessCenter"> </xsl:element> <xsl:template match="Member"> <xsl:element name="Member"> Cont. -->

(see xml-example01) <xsl:template match="Name"> <xsl:element name="Name"> <xsl:apply-templates/> </xsl:element> </xsl:template> <xsl:template match="Phone"> <xsl:element name="Phone"> <xsl:template match="FavoriteColor"> <xsl:element name="FavoriteColor"> <xsl:template match="text()"> <xsl:value-of select="."/> </xsl:stylesheet> (see xml-example01)

Note that we've lost the attribute on the Member element <?xml version="1.0" encoding="UTF-8"?> <FitnessCenter> <Member> <Name>Jeff</Name> <Phone>555-1234</Phone> <Phone>555-4321</Phone> <FavoriteColor>lightgrey</FavoriteColor> </Member> <Name>David</Name> <Phone>383-1234</Phone> <Phone>383-4321</Phone> <FavoriteColor>lightblue</FavoriteColor> <Name>Roger</Name> <Phone>888-1234</Phone> <Phone>888-4321</Phone> <FavoriteColor>lightyellow</FavoriteColor> </FitnessCenter> Note that we've lost the attribute on the Member element

Getting Member’s Attribute: <xsl:template match="Member"> <xsl:element name="Member"> <xsl:for-each select="@*"> <xsl:attribute name="{name(.)}"> <xsl:value-of select="."/> </xsl:attribute> </xsl:for-each> <xsl:apply-templates/> </xsl:element> </xsl:template> (see xml-example02) For each attribute Add an attribute to the element being output. The name of the attribute is the name of the current attribute being processed. The value of the attribute is the value of the current attribute being processed.

<?xml version="1.0" encoding="UTF-8"?> <FitnessCenter> <Member level=“platinum”> <Name>Jeff</Name> <Phone type="home">555-1234</Phone> <Phone type="work">555-4321</Phone> <FavoriteColor>lightgrey</FavoriteColor> </Member> <Member level=“gold”> <Name>David</Name> <Phone type="home">383-1234</Phone> <Phone type="work">383-4321</Phone> <FavoriteColor>lightblue</FavoriteColor> <Name>Roger</Name> <Phone type="home">888-1234</Phone> <Phone type="work">888-4321</Phone> <FavoriteColor>lightyellow</FavoriteColor> </FitnessCenter>

Generalize Our identity stylesheet will only work for FitnessCenter XML documents. We can make a stylesheet which does an identity transformation on any XML document.

(see xml-example03) <?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="xml"/> <xsl:template match="/"> <xsl:apply-templates/> </xsl:template> <xsl:template match="*"> <xsl:element name="{name(.)}"> <xsl:for-each select="@*"> <xsl:attribute name="{name(.)}"> <xsl:value-of select="."/> </xsl:attribute> </xsl:for-each> </xsl:element> <xsl:template match="text()"> </xsl:stylesheet> (see xml-example03)

Default Template Rules Every xsl document has two default template rules These rules are applied when the XSL Processor cannot find a template rule to use in your stylesheet Here are the two default template rules: <xsl:template match=“/ | *”> <xsl:apply-templates/> </xsl:template> <xsl:template match=“text()”> <xsl:value-of select=“.”/> “Match on the document or any element. The action is to go to the children and execute their template rules.” “Match on a text node. The action is to output the value of the text node.”

Multiple Applicable Rules Suppose that the XSL Processor is processing FitnessCenter and it gets to the <Member> element. Why does it use: <xsl:template match=“Member”>... and not the default template rule: <xsl:template match=“/ | *”>... ??? After all, both apply. Answer: given two rules that apply, the more specific rule wins. --> Clearly, “*” is much more general than “Member”. “*” matches on any element. “Member” just matches on the Member element.

Smallest Identity Transformation Stylesheet Now that we know about the default template rules, we can further reduce the size of the stylesheet.

(see xml-example04) <?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="xml"/> <xsl:template match="*"> <xsl:element name="{name(.)}"> <xsl:for-each select="@*"> <xsl:attribute name="{name(.)}"> <xsl:value-of select="."/> </xsl:attribute> </xsl:for-each> <xsl:apply-templates/> </xsl:element> </xsl:template> </xsl:stylesheet> (see xml-example04)

<xsl:apply-templates select=“pattern”> The xsl:apply-templates element (without the select attribute) tells the XSL Processor to apply the template rules to all children (in document order) The xsl: apply-templates element can have a select attribute that tells the XSL Processor to process only the child element that matches “pattern”. Thus, the select attribute rule enables us to specify the order in which the children are processed

<xsl:apply-templates select=“pattern”> <xsl:template match="Member"> <xsl:apply-templates select="Name"/> <xsl:apply-templates select="Phone[@type='work']"/> </xsl:template> "Go to the template rule for my Name child element. Then go to the template rule for the work Phone child element." <xsl:template match="Member"> <xsl:apply-templates select="*"/> </xsl:template> "Go to all the child element nodes (not to any child text nodes)." Do Lab4, Part 1-4

Any Difference? <xsl:template match=“FitnessCenter”> <xsl:element name=“{name(.)}”> <xsl:apply-templates/> </xsl:element> </xsl:template> <xsl:template match=“FitnessCenter”> <xsl:element name=“FitnessCenter”> <xsl:apply-templates/> </xsl:element> </xsl:template> <xsl:template match=“FitnessCenter”> <FitnessCenter> <xsl:apply-templates/> </FitnessCenter> </xsl:template>

Can we use anything other that name(.)? <xsl:template match="*"> <xsl:element name="{name(.)}"> <xsl:for-each select="@*"> <xsl:attribute name="{name(.)}"> <xsl:value-of select="."/> </xsl:attribute> </xsl:for-each> <xsl:apply-templates/> </xsl:element> </xsl:template>

The XSL Vocabulary stylesheet An XSL Processor is a piece of software http://www.w3.org/1999/XSL/Transform stylesheet An XSL Processor is a piece of software which understands the semantics of this vocabulary if for-each choose apply-templates value-of xsl: template

Name of Prefix - Irrelevant! http://www.w3.org/1999/XSL/Transform stylesheet We can call this anything we want if for-each choose apply-templates value-of xsl: template

mode Attribute Allows you to create multiple template rules for the same element. Each template rule can process the element differently. So, you can have multiple template rules for the same element. Just give each template rule a different mode <xsl:template match="Name" mode="Normal"> <xsl:template match="Name" mode="footnote">

Problem Identity transform the FitnessCenter.xml document. However, after you have copied all the Members, follow up with a (new) GoldMembers section, containing the name of each gold member (within stars) The next slide shows what the output XML file should look like

(see xml-example05) Note that the names here are processed differently <?xml version="1.0" encoding="UTF-8"?> <FitnessCenter> <Member level="platinum"> <Name>Jeff</Name> <Phone>555-1234</Phone> <Phone>555-4321</Phone> <FavoriteColor>lightgrey</FavoriteColor> </Member> <Member level="gold"> <Name>David</Name> <Phone>383-1234</Phone> <Phone>383-4321</Phone> <FavoriteColor>lightblue</FavoriteColor> <Name>Roger</Name> <Phone>888-1234</Phone> <Phone>888-4321</Phone> <FavoriteColor>lightyellow</FavoriteColor> <GoldMembers> <Name>***David***</Name> </GoldMembers> </FitnessCenter> Note that the names here are processed differently than the name in the GoldMembers section (see xml-example05)

<?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="xml"/> <xsl:template match="/"> <xsl:apply-templates/> </xsl:template> <xsl:template match="FitnessCenter"> <xsl:element name="FitnessCenter"> <xsl:element name="GoldMembers"> <xsl:for-each select="Member[@level='gold']"> <xsl:apply-templates select="Name" mode="footnote"/> </xsl:for-each> </xsl:element> <xsl:template match="Member"> <xsl:element name="Member"> <xsl:for-each select="@*"> <xsl:attribute name="{name(.)}"> <xsl:value-of select="."/> </xsl:attribute> <xsl:apply-templates mode="Normal"/>

<xsl:template match="Name" mode="Normal"> <xsl:element name="Name"> <xsl:apply-templates/> </xsl:element> </xsl:template> <xsl:template match="Name" mode="footnote"> <xsl:text>***</xsl:text> <xsl:template match="Phone" mode="Normal"> <xsl:element name="Phone"> <xsl:template match="FavoriteColor" mode="Normal"> <xsl:element name="FavoriteColor"> </xsl:stylesheet> Do Lab5, Part 1

Stylesheet Reuse via xsl:include and xsl:import The elements xsl:include and xsl:import enable you to reuse other stylesheets. These elements are “top-level elements”. This means that they must be immediate children of the xsl:stylesheet element (i.e., they cannot be within a template rule) The xsl:include element is basically a macro substitution - the element is replaced by the contents of stylesheet it references

Replace the xsl:include element with the contents <?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:include href="file://localhost/xml-course/new-xsl/toUpperCase.xsl"/> <xsl:template match="FitnessCenter"> ... </xsl:template> </xsl:stylesheet> <?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:variable name="lcase" select="'abcdefghijklmnopqrstuvwxyz'"/> <xsl:variable name="ucase" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'"/> <xsl:template match="*"> <xsl:apply-templates select="@* | * | text() | comment() | processing-instruction()"/> </xsl:template> <xsl:template match="@*"> <xsl:value-of select="translate(.,$lcase, $ucase)"/> <xsl:template match="text()"> </xsl:stylesheet> Replace the xsl:include element with the contents of the referenced stylesheet (i.e., all the children of xsl:stylesheet) toUpperCase.xsl

xsl:import xsl:import acts just like xsl:include - the stylesheet that it references is macro-substituted. However, there is a difference: With xsl:include the stuff that is macro-substituted into the stylesheet has the same precedence as the rest of the stylesheet. It is as though you had one stylesheet. With xsl:import the stuff that is macro-substituted into the stylesheet has lower precedence than the rest of the stylesheet. Also, all xsl:import elements must come first in the stylesheet.

Pipelining Stylesheets Using the XSL API (TRaX - Transformation API for XML) I have created a program which enables you to have a pipeline of stylesheets, i.e., the output of stylesheet[i] is the input to stylesheet[i+1] Example: XML XSL XSL List of Member names, in upper case! FitnessCenter.xml generateNameList.xsl toUpperCase.xsl See xml-example06. Type this at the DOS prompt: run-xalan FitnessCenter.xml generateNameList.xsl toUpperCase.xsl

xml-example06 Here's how to use the program that I created: run-xalan <xml file> <xsl file> … <xsl file> That is, you can specify any number of xsl files to be used in the pipeline.