YouTube video embedding with XSLT

A while ago, I published an article on how to use Python’s docutils to expand some markup in reStructuredText into the HTML for a YouTube embedded video. Just for fun, here’s an XSLT stylesheet that does something similar. It hasn’t had a chance to be used in production, but if you have an XSLT-based web application, it might come in useful.

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns="http://www.w3.org/1999/xhtml">

    <!-- Replaces elements of thei form <youtube id="asdfasdf" /> with the
    correct XHTML object element to embed a YouTube video -->

    <!-- If desired, one can also place arbitrary elements inside the youtube
    element that will be converted into parameters of the object element.
    E.g. the element <fullscreen>true</fullscreen> will be converted to
    <param name="fullscreen" value="true" /> -->

    <xsl:strip-space elements="youtube"/>

    <xsl:template match="youtube">
        <xsl:element name="object">
            <xsl:attribute name="type">application/x-shockwave-flash</xsl:attribute>
            <xsl:attribute name="width">425</xsl:attribute>
            <xsl:attribute name="height">344</xsl:attribute>
            <xsl:attribute name="class">youtube-embed</xsl:attribute>
            <xsl:attribute name="data">
                http://www.youtube.com/v/<xsl:value-of select="@id"/>
            </xsl:attribute>
            <xsl:element name="param">
                <xsl:attribute name="name">movie</xsl:attribute>
                <xsl:attribute name="value">
                    http://www.youtube.com/v/<xsl:value-of select="@id"/>
                </xsl:attribute>
            </xsl:element>
            <xsl:element name="param">
                <xsl:attribute name="name">wmode</xsl:attribute>
                <xsl:attribute name="value">transparent</xsl:attribute>
            </xsl:element>
            <xsl:apply-templates mode="youtube-params" />
        </xsl:element>
    </xsl:template>

    <xsl:template match="youtube/*" mode="youtube-params">
        <xsl:element name="param">
            <xsl:attribute name="name"><xsl:value-of select="local-name()" /></xsl:attribute>
            <xsl:attribute name="value"><xsl:value-of select="text()" /></xsl:attribute>
        </xsl:element>
    </xsl:template>

</xsl:stylesheet>

As the comment notes, you need to run this on an XML document that contains elements like <youtube id="asdfasdf" />. It’s not currently configurable as to the width, height, and other parameters (except by changing the XSLT) but could be made so.

Recent posts