def test_key_1(): """basic keys""" _run_html(source_xml=FILE_SOURCE_XML, source_uri=FILE_URI, transform_xml="""<?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- silly bit of overkill for key usage, but executes the basic test --> <xsl:key name='name' match='ENTRY' use='NAME'/> <xsl:template match="/"> <HTML> <HEAD> <TITLE>Address Book</TITLE> </HEAD> <BODY> <H1><xsl:text>Tabulate just the Names</xsl:text></H1> <TABLE><xsl:apply-templates/></TABLE> </BODY> </HTML> </xsl:template> <xsl:template match="ENTRY"> <TR> <xsl:apply-templates select='NAME'/> </TR> </xsl:template> <xsl:template match="NAME"> <TD ALIGN="CENTER"> <B ID='{key("name", .)/EMAIL}'><xsl:apply-templates/></B> </TD> </xsl:template> </xsl:stylesheet> """, expected="""<HTML> <HEAD> <meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1'> <TITLE>Address Book</TITLE> </HEAD> <BODY> <H1>Tabulate just the Names</H1> <TABLE> \x20\x20\x20\x20 <TR> <TD ALIGN='CENTER'><B ID='*****@*****.**'>Pieter Aaron</B></TD> </TR> \x20\x20\x20\x20 <TR> <TD ALIGN='CENTER'><B ID='*****@*****.**'>Emeka Ndubuisi</B></TD> </TR> \x20\x20\x20\x20 <TR> <TD ALIGN='CENTER'><B ID='*****@*****.**'>Vasia Zhugenev</B></TD> </TR> </TABLE> </BODY> </HTML>""")
def test_basics_3(): _run_html( FILE('addr_book1.xml'), """<?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" > <xsl:strip-space elements="*"/> <xsl:template match="/"> <HTML> <HEAD><TITLE>Address Book</TITLE> </HEAD> <BODY> <H1><xsl:text>Tabulate just the Names</xsl:text></H1> <TABLE><xsl:apply-templates/></TABLE> </BODY> </HTML> </xsl:template> <xsl:template match="ADDRBOOK"> <xsl:apply-templates/> </xsl:template> <xsl:template match="ENTRY"> <TR> <xsl:apply-templates/> </TR> </xsl:template> <xsl:template match="NAME"> <TD ALIGN="CENTER"> <B><xsl:apply-templates/></B> </TD> </xsl:template> <xsl:template match="*"/> </xsl:stylesheet> """, """<HTML> <HEAD> <meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1'> <TITLE>Address Book</TITLE> </HEAD> <BODY> <H1>Tabulate just the Names</H1> <TABLE> <TR> <TD ALIGN='CENTER'><B>Pieter Aaron</B></TD> </TR> <TR> <TD ALIGN='CENTER'><B>Emeka Ndubuisi</B></TD> </TR> <TR> <TD ALIGN='CENTER'><B>Vasia Zhugenev</B></TD> </TR> </TABLE> </BODY> </HTML>""")
def test_basics_1(): _run_html( FILE("addr_book1.xml"), FILE("addr_book1.xsl"), """<html> <head> <meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1'> <title>Address Book</title> </head> <body> <h1>Tabulate Just Names and Phone Numbers</h1> <table> \x20\x20\x20\x20 <tr> <td align='center'><b>Pieter Aaron</b></td> <td>(Work) 404-555-1234<br>(Fax) 404-555-4321<br>(Pager) 404-555-5555</td> </tr> \x20\x20\x20\x20 <tr> <td align='center'><b>Emeka Ndubuisi</b></td> <td>(Work) 767-555-7676<br>(Fax) 767-555-7642<br>(Pager) 800-SKY-PAGEx767676</td> </tr> \x20\x20\x20\x20 <tr> <td align='center'><b>Vasia Zhugenev</b></td> <td>(Work) 000-987-6543<br>(Cell) 000-000-0000</td> </tr> </table> </body> </html>""", )
def test_basics_1(): _run_html( FILE('addr_book1.xml'), FILE('addr_book1.xsl'), """<html> <head> <meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1'> <title>Address Book</title> </head> <body> <h1>Tabulate Just Names and Phone Numbers</h1> <table> \x20\x20\x20\x20 <tr> <td align='center'><b>Pieter Aaron</b></td> <td>(Work) 404-555-1234<br>(Fax) 404-555-4321<br>(Pager) 404-555-5555</td> </tr> \x20\x20\x20\x20 <tr> <td align='center'><b>Emeka Ndubuisi</b></td> <td>(Work) 767-555-7676<br>(Fax) 767-555-7642<br>(Pager) 800-SKY-PAGEx767676</td> </tr> \x20\x20\x20\x20 <tr> <td align='center'><b>Vasia Zhugenev</b></td> <td>(Work) 000-987-6543<br>(Cell) 000-000-0000</td> </tr> </table> </body> </html>""")
def test_fallback_3(): """forwards-compatible example from XSLT 1.0 specification""" _run_html( source_xml = FALLBACK_SOURCE_XML, transform_uri = TRANSFORM_URI, transform_xml = """<?xml version="1.0"?> <xsl:stylesheet version="1.1" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <xsl:choose> <xsl:when test="system-property('xsl:version') >= 1.1"> <xsl:exciting-new-1.1-feature/> </xsl:when> <xsl:otherwise> <html> <head> <title>XSLT 1.1 required</title> </head> <body> <p>Sorry, this stylesheet requires XSLT 1.1.</p> </body> </html> </xsl:otherwise> </xsl:choose> </xsl:template> </xsl:stylesheet> """, expected = """<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <title>XSLT 1.1 required</title> </head> <body> <p>Sorry, this stylesheet requires XSLT 1.1.</p> </body> </html>""")
def test_basics_11(): _run_html( '<div><hr noshade="noshade"/></div>', OUTPUT_TEMPLATE % 'method="html"', """<div> <hr noshade> </div>""", )
def test_basics_10(): _run_html( '<div><hr noshade="noshade"/></div>', OUTPUT_TEMPLATE % 'method="html" indent="yes"', expected="""<div> <hr noshade> </div>""", )
def test_basics_2(): _run_html( FILE("addr_book1.xml"), """<?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" > <xsl:output method="html"/> <xsl:template match="/"> <HTML> <HEAD><TITLE>Address Book</TITLE> </HEAD> <BODY> <H1><xsl:text>Tabulate just the Names</xsl:text></H1> <TABLE><xsl:apply-templates/></TABLE> </BODY> </HTML> </xsl:template> <xsl:template match="ENTRY"> <TR> <xsl:apply-templates select='NAME|PHONENUM'/> </TR> </xsl:template> <xsl:template match="NAME"> <TD ALIGN="CENTER"> <B><xsl:apply-templates/></B> </TD> </xsl:template> </xsl:stylesheet> """, """<HTML> <HEAD> <meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1'> <TITLE>Address Book</TITLE> </HEAD> <BODY> <H1>Tabulate just the Names</H1> <TABLE> \x20\x20\x20\x20 <TR> <TD ALIGN='CENTER'><B>Pieter Aaron</B></TD>404-555-1234404-555-4321404-555-5555</TR> \x20\x20\x20\x20 <TR> <TD ALIGN='CENTER'><B>Emeka Ndubuisi</B></TD>767-555-7676767-555-7642800-SKY-PAGEx767676</TR> \x20\x20\x20\x20 <TR> <TD ALIGN='CENTER'><B>Vasia Zhugenev</B></TD>000-987-6543000-000-0000</TR> </TABLE> </BODY> </HTML>""", )
def test_elem_attr_1(): """`xsl:element` and `xsl:attribute` instantiation""" _run_html( source_xml = inputsource(os.path.join(module_dirname, 'addr_book1.xml')), source_uri = "file:" + module_dirname + "/addr_book1.xml", transform_xml = """<?xml version="1.0"?> <xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="/"> <HTML> <HEAD><TITLE>Address Book</TITLE> </HEAD> <BODY> <TABLE><xsl:apply-templates/></TABLE> </BODY> </HTML> </xsl:template> <xsl:template match="ENTRY"> <xsl:element name='TR'> <xsl:apply-templates select='NAME'/> </xsl:element> </xsl:template> <xsl:template match="NAME"> <xsl:element name='TD'> <xsl:attribute name='ALIGN'>CENTER</xsl:attribute> <B><xsl:apply-templates/></B> </xsl:element> </xsl:template> </xsl:transform>""", expected = """<HTML> <HEAD> <META HTTP-EQUIV='Content-Type' CONTENT='text/html; charset=iso-8859-1'> <TITLE>Address Book</TITLE> </HEAD> <BODY> <TABLE> \x20\x20\x20\x20 <TR> <TD ALIGN='CENTER'><B>Pieter Aaron</B></TD> </TR> \x20\x20\x20\x20 <TR> <TD ALIGN='CENTER'><B>Emeka Ndubuisi</B></TD> </TR> \x20\x20\x20\x20 <TR> <TD ALIGN='CENTER'><B>Vasia Zhugenev</B></TD> </TR> </TABLE> </BODY> </HTML>""")
def test_basics_2(): _run_html( FILE('addr_book1.xml'), """<?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" > <xsl:output method="html"/> <xsl:template match="/"> <HTML> <HEAD><TITLE>Address Book</TITLE> </HEAD> <BODY> <H1><xsl:text>Tabulate just the Names</xsl:text></H1> <TABLE><xsl:apply-templates/></TABLE> </BODY> </HTML> </xsl:template> <xsl:template match="ENTRY"> <TR> <xsl:apply-templates select='NAME|PHONENUM'/> </TR> </xsl:template> <xsl:template match="NAME"> <TD ALIGN="CENTER"> <B><xsl:apply-templates/></B> </TD> </xsl:template> </xsl:stylesheet> """, """<HTML> <HEAD> <meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1'> <TITLE>Address Book</TITLE> </HEAD> <BODY> <H1>Tabulate just the Names</H1> <TABLE> \x20\x20\x20\x20 <TR> <TD ALIGN='CENTER'><B>Pieter Aaron</B></TD>404-555-1234404-555-4321404-555-5555</TR> \x20\x20\x20\x20 <TR> <TD ALIGN='CENTER'><B>Emeka Ndubuisi</B></TD>767-555-7676767-555-7642800-SKY-PAGEx767676</TR> \x20\x20\x20\x20 <TR> <TD ALIGN='CENTER'><B>Vasia Zhugenev</B></TD>000-987-6543000-000-0000</TR> </TABLE> </BODY> </HTML>""")
def test_text_1(): """<xsl:text> with disable-output-escaping='yes'""" _run_html(source_xml="""<noescape>dummy</noescape>""", transform_xml="""<?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html"/> <xsl:template match="/"> <xsl:apply-templates/> </xsl:template> <xsl:template match="noescape"> <html><p><xsl:text disable-output-escaping='yes'>&nbsp;</xsl:text></p></html> </xsl:template> </xsl:stylesheet> """, expected="""<html> <p> </p> </html>""")
def test_text_1(): """<xsl:text> with disable-output-escaping='yes'""" _run_html( source_xml = """<noescape>dummy</noescape>""", transform_xml = """<?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html"/> <xsl:template match="/"> <xsl:apply-templates/> </xsl:template> <xsl:template match="noescape"> <html><p><xsl:text disable-output-escaping='yes'>&nbsp;</xsl:text></p></html> </xsl:template> </xsl:stylesheet> """, expected ="""<html> <p> </p> </html>""")
def test_basics_11(): _run_html('<div><hr noshade="noshade"/></div>', OUTPUT_TEMPLATE % 'method="html"', """<div> <hr noshade> </div>""")
def test_basics_10(): _run_html('<div><hr noshade="noshade"/></div>', OUTPUT_TEMPLATE % 'method="html" indent="yes"', expected="""<div> <hr noshade> </div>""")
def test_basics_4(): _run_html( """<?xml version = "1.0"?> <?xml-stylesheet type="text/xml" href="Xml/Xslt/Core/addr_book1.xsl"?> <!DOCTYPE ADDRBOOK [ <!ELEMENT ADDRBOOK (ENTRY*)> <!ATTLIST ADDRBOOK xmlns CDATA #FIXED 'http://spam.org' > <!ELEMENT ENTRY (NAME, ADDRESS, PHONENUM*, EMAIL)> <!ATTLIST ENTRY ID ID #REQUIRED > <!ELEMENT NAME (#PCDATA)> <!ELEMENT ADDRESS (#PCDATA)> <!ELEMENT PHONENUM (#PCDATA)> <!ATTLIST PHONENUM DESC CDATA #REQUIRED > <!ELEMENT EMAIL (#PCDATA)> ]> <ADDRBOOK> <ENTRY ID="pa"> <NAME>Pieter Aaron</NAME> <ADDRESS>404 Error Way</ADDRESS> <PHONENUM DESC="Work">404-555-1234</PHONENUM> <PHONENUM DESC="Fax">404-555-4321</PHONENUM> <PHONENUM DESC="Pager">404-555-5555</PHONENUM> <EMAIL>[email protected]</EMAIL> </ENTRY> <ENTRY ID="en"> <NAME>Emeka Ndubuisi</NAME> <ADDRESS>42 Spam Blvd</ADDRESS> <PHONENUM DESC="Work">767-555-7676</PHONENUM> <PHONENUM DESC="Fax">767-555-7642</PHONENUM> <PHONENUM DESC="Pager">800-SKY-PAGEx767676</PHONENUM> <EMAIL>[email protected]</EMAIL> </ENTRY> <ENTRY ID="vz"> <NAME>Vasia Zhugenev</NAME> <ADDRESS>2000 Disaster Plaza</ADDRESS> <PHONENUM DESC="Work">000-987-6543</PHONENUM> <PHONENUM DESC="Cell">000-000-0000</PHONENUM> <EMAIL>[email protected]</EMAIL> </ENTRY> </ADDRBOOK>""", """<?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:A="http://spam.org" version="1.0" > <xsl:output method="html"/> <xsl:template match="/"> <HTML> <HEAD><TITLE>Address Book</TITLE> </HEAD> <BODY> <H1><xsl:text>Tabulate just the Names</xsl:text></H1> <TABLE><xsl:apply-templates/></TABLE> </BODY> </HTML> </xsl:template> <xsl:template match="A:ENTRY"> <TR> <xsl:apply-templates select='A:NAME|A:PHONENUM'/> </TR> </xsl:template> <xsl:template match="A:NAME"> <TD ALIGN="CENTER"> <B><xsl:apply-templates/></B> </TD> </xsl:template> </xsl:stylesheet> """, """<HTML xmlns:A='http://spam.org'> <HEAD> <meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1'> <TITLE>Address Book</TITLE> </HEAD> <BODY> <H1>Tabulate just the Names</H1> <TABLE> \x20\x20\x20\x20 <TR> <TD ALIGN='CENTER'><B>Pieter Aaron</B></TD>404-555-1234404-555-4321404-555-5555</TR> \x20\x20\x20\x20 <TR> <TD ALIGN='CENTER'><B>Emeka Ndubuisi</B></TD>767-555-7676767-555-7642800-SKY-PAGEx767676</TR> \x20\x20\x20\x20 <TR> <TD ALIGN='CENTER'><B>Vasia Zhugenev</B></TD>000-987-6543000-000-0000</TR> </TABLE> </BODY> </HTML>""")
def test_choose_1(): """`xsl:choose""" _run_html( source_xml = inputsource(os.path.join(module_name, "addr_book1.xml")), source_uri = "file:" + module_name + "/addr_book1.xml", transform_xml = """<?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method='html'/> <xsl:template match="/"> <HTML> <HEAD><TITLE>Address Book</TITLE> </HEAD> <BODY> <TABLE><xsl:apply-templates/></TABLE> </BODY> </HTML> </xsl:template> <xsl:template match="ENTRY"> <xsl:element name='TR'> <xsl:apply-templates select='NAME'/> </xsl:element> </xsl:template> <xsl:template match="NAME"> <xsl:element name='TD'> <xsl:attribute name='ALIGN'>CENTER</xsl:attribute> <B><xsl:apply-templates/></B> <xsl:choose> <xsl:when test="text()='Pieter Aaron'">: Employee 1</xsl:when> <xsl:when test="text()='Emeka Ndubuisi'">: Employee 2</xsl:when> <xsl:otherwise>: Other Employee</xsl:otherwise> </xsl:choose> </xsl:element> </xsl:template> </xsl:stylesheet> """, expected ="""<HTML> <HEAD> <meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1'> <TITLE>Address Book</TITLE> </HEAD> <BODY> <TABLE> \x20\x20\x20\x20 <TR> <TD ALIGN='CENTER'><B>Pieter Aaron</B>: Employee 1</TD> </TR> \x20\x20\x20\x20 <TR> <TD ALIGN='CENTER'><B>Emeka Ndubuisi</B>: Employee 2</TD> </TR> \x20\x20\x20\x20 <TR> <TD ALIGN='CENTER'><B>Vasia Zhugenev</B>: Other Employee</TD> </TR> </TABLE> </BODY> </HTML>""")
def test_key_1(): """basic keys""" _run_html( source_xml = FILE_SOURCE_XML, source_uri = FILE_URI, transform_xml = """<?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- silly bit of overkill for key usage, but executes the basic test --> <xsl:key name='name' match='ENTRY' use='NAME'/> <xsl:template match="/"> <HTML> <HEAD> <TITLE>Address Book</TITLE> </HEAD> <BODY> <H1><xsl:text>Tabulate just the Names</xsl:text></H1> <TABLE><xsl:apply-templates/></TABLE> </BODY> </HTML> </xsl:template> <xsl:template match="ENTRY"> <TR> <xsl:apply-templates select='NAME'/> </TR> </xsl:template> <xsl:template match="NAME"> <TD ALIGN="CENTER"> <B ID='{key("name", .)/EMAIL}'><xsl:apply-templates/></B> </TD> </xsl:template> </xsl:stylesheet> """, expected = """<HTML> <HEAD> <meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1'> <TITLE>Address Book</TITLE> </HEAD> <BODY> <H1>Tabulate just the Names</H1> <TABLE> \x20\x20\x20\x20 <TR> <TD ALIGN='CENTER'><B ID='*****@*****.**'>Pieter Aaron</B></TD> </TR> \x20\x20\x20\x20 <TR> <TD ALIGN='CENTER'><B ID='*****@*****.**'>Emeka Ndubuisi</B></TD> </TR> \x20\x20\x20\x20 <TR> <TD ALIGN='CENTER'><B ID='*****@*****.**'>Vasia Zhugenev</B></TD> </TR> </TABLE> </BODY> </HTML>""")
def test_basics_4(): _run_html( """<?xml version = "1.0"?> <?xml-stylesheet type="text/xml" href="Xml/Xslt/Core/addr_book1.xsl"?> <!DOCTYPE ADDRBOOK [ <!ELEMENT ADDRBOOK (ENTRY*)> <!ATTLIST ADDRBOOK xmlns CDATA #FIXED 'http://spam.org' > <!ELEMENT ENTRY (NAME, ADDRESS, PHONENUM*, EMAIL)> <!ATTLIST ENTRY ID ID #REQUIRED > <!ELEMENT NAME (#PCDATA)> <!ELEMENT ADDRESS (#PCDATA)> <!ELEMENT PHONENUM (#PCDATA)> <!ATTLIST PHONENUM DESC CDATA #REQUIRED > <!ELEMENT EMAIL (#PCDATA)> ]> <ADDRBOOK> <ENTRY ID="pa"> <NAME>Pieter Aaron</NAME> <ADDRESS>404 Error Way</ADDRESS> <PHONENUM DESC="Work">404-555-1234</PHONENUM> <PHONENUM DESC="Fax">404-555-4321</PHONENUM> <PHONENUM DESC="Pager">404-555-5555</PHONENUM> <EMAIL>[email protected]</EMAIL> </ENTRY> <ENTRY ID="en"> <NAME>Emeka Ndubuisi</NAME> <ADDRESS>42 Spam Blvd</ADDRESS> <PHONENUM DESC="Work">767-555-7676</PHONENUM> <PHONENUM DESC="Fax">767-555-7642</PHONENUM> <PHONENUM DESC="Pager">800-SKY-PAGEx767676</PHONENUM> <EMAIL>[email protected]</EMAIL> </ENTRY> <ENTRY ID="vz"> <NAME>Vasia Zhugenev</NAME> <ADDRESS>2000 Disaster Plaza</ADDRESS> <PHONENUM DESC="Work">000-987-6543</PHONENUM> <PHONENUM DESC="Cell">000-000-0000</PHONENUM> <EMAIL>[email protected]</EMAIL> </ENTRY> </ADDRBOOK>""", """<?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:A="http://spam.org" version="1.0" > <xsl:output method="html"/> <xsl:template match="/"> <HTML> <HEAD><TITLE>Address Book</TITLE> </HEAD> <BODY> <H1><xsl:text>Tabulate just the Names</xsl:text></H1> <TABLE><xsl:apply-templates/></TABLE> </BODY> </HTML> </xsl:template> <xsl:template match="A:ENTRY"> <TR> <xsl:apply-templates select='A:NAME|A:PHONENUM'/> </TR> </xsl:template> <xsl:template match="A:NAME"> <TD ALIGN="CENTER"> <B><xsl:apply-templates/></B> </TD> </xsl:template> </xsl:stylesheet> """, """<HTML xmlns:A='http://spam.org'> <HEAD> <meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1'> <TITLE>Address Book</TITLE> </HEAD> <BODY> <H1>Tabulate just the Names</H1> <TABLE> \x20\x20\x20\x20 <TR> <TD ALIGN='CENTER'><B>Pieter Aaron</B></TD>404-555-1234404-555-4321404-555-5555</TR> \x20\x20\x20\x20 <TR> <TD ALIGN='CENTER'><B>Emeka Ndubuisi</B></TD>767-555-7676767-555-7642800-SKY-PAGEx767676</TR> \x20\x20\x20\x20 <TR> <TD ALIGN='CENTER'><B>Vasia Zhugenev</B></TD>000-987-6543000-000-0000</TR> </TABLE> </BODY> </HTML>""", )
def test_basics_3(): _run_html( FILE("addr_book1.xml"), """<?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" > <xsl:strip-space elements="*"/> <xsl:template match="/"> <HTML> <HEAD><TITLE>Address Book</TITLE> </HEAD> <BODY> <H1><xsl:text>Tabulate just the Names</xsl:text></H1> <TABLE><xsl:apply-templates/></TABLE> </BODY> </HTML> </xsl:template> <xsl:template match="ADDRBOOK"> <xsl:apply-templates/> </xsl:template> <xsl:template match="ENTRY"> <TR> <xsl:apply-templates/> </TR> </xsl:template> <xsl:template match="NAME"> <TD ALIGN="CENTER"> <B><xsl:apply-templates/></B> </TD> </xsl:template> <xsl:template match="*"/> </xsl:stylesheet> """, """<HTML> <HEAD> <meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1'> <TITLE>Address Book</TITLE> </HEAD> <BODY> <H1>Tabulate just the Names</H1> <TABLE> <TR> <TD ALIGN='CENTER'><B>Pieter Aaron</B></TD> </TR> <TR> <TD ALIGN='CENTER'><B>Emeka Ndubuisi</B></TD> </TR> <TR> <TD ALIGN='CENTER'><B>Vasia Zhugenev</B></TD> </TR> </TABLE> </BODY> </HTML>""", )