嵌入式Youtube视频在XSL文件中

时间:2014-09-11 17:17:14

标签: xml xslt xslt-1.0 xslt-2.0

所以我有一个XSL文件,我希望有一个嵌入式YouTube视频可以在同一页面上显示和播放而无需将我带到youtube。我有嵌入式代码,我试图使用XSL embed template example
[注意:我已为每个参数添加了我的值]

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes" encoding="UTF-8"/>
    <xsl:param name="contextPath">CONTEXT_PATH/</xsl:param>
    <xsl:include href="xhtml.xsl"/>
  <xsl:variable name="site" select="/home/tree/path/node[2]/@name"/>
    <xsl:template match="home">
        <xsl:element name="div">
            <xsl:attribute name="id">content-type</xsl:attribute>
            <xsl:attribute name="class">home</xsl:attribute>

          <xsl:choose>
           <xsl:when test="$site='Chameleon'">
            <xsl:call-template name="video-media">
                <xsl:with-param name="width" select="640"/>
                <xsl:with-param name="height" select="348"/>
                <xsl:with-param name="element" select="video-url"/>
            </xsl:call-template>



            <xsl:template name="video-media">
                <xsl:param name="element" select="video-url" />
                <xsl:param name="width" select="640"/>
                <xsl:param name="height" select="348"/>
                <xsl:param name="color" select="'ffffff'"/>
                <xsl:param name="title" select="'0'"/>
                <xsl:param name="byline" select="'0'"/>
                <xsl:param name="portrait" select="'0'"/>
                <xsl:param name="frameborder" select="'0'"/>
                <xsl:param name="video-id">
                    <xsl:choose>
                        <xsl:when test="contains($element,'youtube.com/watch?v=Bctaf7alxpE')">
                            <xsl:value-of select="substring-after($element,'youtube.com/watch?v=Bctaf7alxpE')"/>
                        </xsl:when>
                        <xsl:when test="contains($element,'youtube.com/v/Bctaf7alxpE')">
                            <xsl:value-of select="substring-after($element,'youtube.com/v/Bctaf7alxpE')"/>
                        </xsl:when>
                        <xsl:when test="contains($element,'youtu.be/Bctaf7alxpE')">
                            <xsl:value-of select="substring-after($element,'youtube.com/watch?v=Bctaf7alxpE')"/>
                        </xsl:when>
                    </xsl:choose>
                </xsl:param>

                <div class="video-container">
                    <xsl:choose>
                        <xsl:when test="contains($element,'youtube.com') or contains($element, 'youtu.be')">
                            <iframe class="youtube-player" type="text/html" width="560" height="315" src="http://www.youtube.com/embed/Bctaf7alxpE" frameborder="0">
                                <xsl:comment> You Tube Player </xsl:comment>
                            </iframe>
                        </xsl:when>
                    </xsl:choose>
                </div>
            </xsl:template>
        </xsl:when>

       <xsl:when test="$site='anotherSite'">
        <!-- Does Something Different here... -->
       </xsl:when>

       <xsl:otherwise>
        <!-- Perform a default action here .... -->
       </xsl:otherwise>
      </xsl:choose>

     </xsl:element>
    </xsl:template>
   </xsl:stylesheet>

但是,我不断收到服务器日志中的错误说明:

[CATALINA.OUT日志]

java.lang.NullPointerException
ERROR:  'null'
FATAL ERROR:  'Could not compile stylesheet'

[我的申请日志]

  

2014-09-11 17:28:41,731 WARN com。[我的应用程序/项目树] - 缺少参数,因此无法查找页面

我并不是真的担心日志,但是我得到一个空的事实真的令人沮丧,因为我为每个参数分配了一个值。

2 个答案:

答案 0 :(得分:2)

如果没有看到完整的,最小的问题示例,很难肯定地说,但鉴于你发布的XSLT片段,这里有几种可能性:

  1. 确保xsl:call-template不是孩子 xsl:stylesheet。也许你的原始代码是正确的, 但鉴于您的代码片段的发布方式,它并不清楚 问题。
  2. 您不能同时拥有@select属性和子元素 xsl:choose参数的{video-id}。
  3. 这两个错误中的任何一个都可能导致您的XSLT编译失败。

    每个OP编辑XSLT代码更新:

    新发布的代码中存在更多基本错误:

    1. </xsl:div>应为</xsl:element>。 (顺便说一下,<xsl:element name="div">...</xsl:element>可以简化为<div>...</div>。)
    2. <xsl:template name="video-media">...</xsl:template>必须是 感动成为xsl:stylesheet的孩子。

答案 1 :(得分:0)

解决了!!!

<xsl:template name="video-media">模板必须是<xsl:stylesheet>的孩子。但是,在名为<xsl:template match="home">的其他模板中,我想调用<xsl:template name="video-media">模板以允许嵌入的视频在<xsl:template match="home">模板中播放。

这是通过代码实现的: <xsl:call-template name="video-media">,给定@select

中的参数值

感谢帮助!!