Chapters: JavaScript HTML & CSS JSON XML YAML ← Full TOC

← XML Index

🔄 XSLT & XSD — Transform XML with XSLT, validate with XSD schemas

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.

📋 Reference

ItemSyntax / ValueDescription
<?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:minOccursminOccurs="0" maxOccurs="unbounded"Element occurrence constraints
xs:simpleType<xs:simpleType>Define simple type with restrictions
lxml XSLTtransform = etree.XSLT(xslt_doc); result = transform(xml_doc)Apply XSLT in Python
lxml validateschema = etree.XMLSchema(xsd_doc); schema.validate(xml_doc)Validate against XSD

💡 Example

<!-- 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 &gt;= <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 &gt;= $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}")

← Python xml  |  🏠 Index