XSLT (eXtensible Stylesheet Language Transformations) transforms XML into HTML, other XML, or plain text. XSD (XML Schema Definition) validates XML structure with rich type constraints — more powerful than DTD.
| Item | Syntax / Value | Description |
|---|---|---|
| <?xml-stylesheet?> | <?xml-stylesheet type="text/xsl" href="style.xsl"?> | Link XSLT to XML file |
| <xsl:stylesheet> | <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> | XSLT root element |
| <xsl:template match> | <xsl:template match="/"> | Match rule for node pattern |
| <xsl:value-of> | <xsl:value-of select="@id"/> | Output string value of XPath |
| <xsl:for-each> | <xsl:for-each select="students/student"> | Loop over node set |
| <xsl:if> | <xsl:if test="@status='active'"> | Conditional output |
| <xsl:choose> | <xsl:choose><xsl:when test="..."> | Multi-way conditional |
| <xsl:sort> | <xsl:sort select="gpa" order="descending"/> | Sort node set |
| <xsl:apply-templates> | <xsl:apply-templates select="courses/course"/> | Apply matching templates |
| <xsl:param> | <xsl:param name="minGpa" select="3.5"/> | XSLT parameter |
| <xsl:variable> | <xsl:variable name="x" select="."/> | XSLT variable |
| <xsl:copy-of> | <xsl:copy-of select="."/> | Copy node including children |
| <xsl:attribute> | <xsl:attribute name="href"><xsl:value-of select="url"/></xsl:attribute> | Create attribute dynamically |
| <xsl:output> | <xsl:output method="html" encoding="UTF-8" indent="yes"/> | Set output format |
| XSD xs:schema | <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> | XSD root element |
| xs:element | <xs:element name="student" type="StudentType"/> | Declare element |
| xs:complexType | <xs:complexType name="StudentType"> | Define complex type |
| xs:sequence | <xs:sequence> | Ordered child elements |
| xs:attribute | <xs:attribute name="id" type="xs:integer" use="required"/> | Declare attribute |
| xs:restriction | <xs:restriction base="xs:string"> | Type restriction |
| xs:pattern | <xs:pattern value="[A-Z]{2}\d{3}"/> | Regex pattern constraint |
| xs:minOccurs | minOccurs="0" maxOccurs="unbounded" | Element occurrence constraints |
| xs:simpleType | <xs:simpleType> | Define simple type with restrictions |
| lxml XSLT | transform = etree.XSLT(xslt_doc); result = transform(xml_doc) | Apply XSLT in Python |
| lxml validate | schema = etree.XMLSchema(xsd_doc); schema.validate(xml_doc) | Validate against XSD |
<!-- students.xsl — Transform XML to HTML table -->
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="UTF-8" indent="yes"/>
<xsl:param name="minGpa" select="3.0"/>
<xsl:template match="/">
<html lang="en">
<head>
<title>Student Report</title>
<style>
body { font-family: Arial; background:#0f172a; color:#e5e7eb; padding:20px }
table { border-collapse:collapse; width:100% }
th,td { padding:10px 12px; border:1px solid #334155; text-align:left }
th { background:#1e293b; color:#22d3ee }
tr:nth-child(even) td { background:#0b1120 }
</style>
</head>
<body>
<h1>Student Report (GPA >= <xsl:value-of select="$minGpa"/>)</h1>
<table>
<thead>
<tr><th>ID</th><th>Name</th><th>GPA</th><th>Courses</th></tr>
</thead>
<tbody>
<xsl:for-each select="students/student[@status='active']">
<xsl:sort select="gpa" order="descending" data-type="number"/>
<xsl:if test="gpa >= $minGpa">
<tr>
<td><xsl:value-of select="@id"/></td>
<td><xsl:value-of select="name"/></td>
<td><xsl:value-of select="gpa"/></td>
<td><xsl:value-of select="count(courses/course)"/></td>
</tr>
</xsl:if>
</xsl:for-each>
</tbody>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
<!-- Apply XSLT in Python (requires lxml: pip install lxml) -->
from lxml import etree
xml_tree = etree.parse("students.xml")
xslt_tree = etree.parse("students.xsl")
transform = etree.XSLT(xslt_tree)
result = transform(xml_tree, minGpa=etree.XSLT.strparam("3.8"))
print(str(result)[:500])
<!-- XSD Schema: students.xsd -->
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="students">
<xs:complexType>
<xs:sequence>
<xs:element name="student" type="StudentType" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="StudentType">
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="email" type="EmailType"/>
<xs:element name="gpa">
<xs:simpleType>
<xs:restriction base="xs:decimal">
<xs:minInclusive value="0.0"/>
<xs:maxInclusive value="4.0"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="courses" type="CoursesType" minOccurs="0"/>
</xs:sequence>
<xs:attribute name="id" type="xs:positiveInteger" use="required"/>
<xs:attribute name="status" use="required">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="active"/>
<xs:enumeration value="inactive"/>
<xs:enumeration value="graduated"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:complexType>
<xs:simpleType name="EmailType">
<xs:restriction base="xs:string">
<xs:pattern value="[\w.+-]+@[\w-]+\.[\w.]+"/>
</xs:restriction>
</xs:simpleType>
<xs:complexType name="CoursesType">
<xs:sequence>
<xs:element name="course" maxOccurs="unbounded" minOccurs="0">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="code" type="xs:string" use="required"/>
<xs:attribute name="credits" type="xs:positiveInteger" use="required"/>
<xs:attribute name="grade" type="xs:string"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:schema>
# Validate with lxml
schema_doc = etree.parse("students.xsd")
schema = etree.XMLSchema(schema_doc)
xml_doc = etree.parse("students.xml")
if schema.validate(xml_doc):
print("✅ XML is valid")
else:
for err in schema.error_log:
print(f"❌ Line {err.line}: {err.message}")