如何在XSLT中声明变量?

时间:2014-10-26 18:06:58

标签: xslt

当我运行以下代码时......

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

<xsl:template match="images">
<ul id="tiles">
    <xsl:for-each select="entry">
        <li>
            <xsl:if test="position() mod 4 = 0">
                <xsl:attribute name="class">fourth</xsl:attribute>
            </xsl:if>

            <xsl:choose>
                <xsl:when test="datei/meta/@width &gt; datei/meta/@height">         
                    <xsl:variable name="width">600</xsl:variable>
                    <xsl:variable name="height">450</xsl:variable>                              
                </xsl:when>
                <xsl:when test="datei/meta/@width &lt; datei/meta/@height">                                 
                    <xsl:variable name="width">600</xsl:variable>
                    <xsl:variable name="height">800</xsl:variable>                      
                </xsl:when>
                <xsl:otherwise>
                    <xsl:variable name="width">600</xsl:variable>
                    <xsl:variable name="height">600</xsl:variable>  
                </xsl:otherwise>
            </xsl:choose>   

            <a href="{$root}/image/2/{$width}/{$height}/5{datei/@path}/{datei/filename}" class="fresco" data-fresco-caption="{titel}" data-fresco-group="event">
                <img src="{$root}/image/2/320/320/5{datei/@path}/{datei/filename}"/>
            </a>
        </li>
    </xsl:for-each>
</ul>
</xsl:template>

</xsl:stylesheet>

我收到错误:

XSLTProcessor::transformToXml():
Variable 'width' has not been declared.
xmlXPathCompiledEval: evaluation failed
Variable 'height' has not been declared.
xmlXPathCompiledEval: evaluation failed

这怎么可能?

我是否以错误的方式声明变量widthheight

感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

您可以声明变量高度,例如:

<xsl:variable name="height">
<xsl:choose>
    <xsl:when test="datei/meta/@width &gt; datei/meta/@height">         
         <xsl:value-of select="'450'"/>                           
    </xsl:when>
    <xsl:when test="datei/meta/@width &lt; datei/meta/@height">
         <xsl:value-of select="'800'"/>                         
    </xsl:when>
    <xsl:otherwise>
         <xsl:value-of select="'600'"/>   
    </xsl:otherwise>
 </xsl:choose>
 </xsl:variable>

由于宽度始终为600,因此无需将其声明为变量,但可能仅适用于您提供的示例,而在其他情况下,宽度可能会有所不同。

在内部声明的变量,例如<xsl:choose>语句超出了此范围。由于在类似的问题中已经提供了很好的解释,正如一个参考这个答案:Variable scope in XSLT

答案 1 :(得分:2)

我有时更喜欢使用模板规则:

<xsl:variable name="width">
  <xsl:apply-templates select="datei/meta/@width" mode="width"/>
</xsl:variable>

<xsl:template match="@width[. &gt; ../@height]" mode="width">600</xsl:template>
<xsl:template match="@width[. &lt; ../@height]" mode="width">600</xsl:template>
<xsl:template match="@width" mode="width">600</xsl:template>

模板规则是XSLT中使用最少的部分。

答案 2 :(得分:1)

这是XSLT变量范围的问题。您已将变量声明在您要使用它们的范围之外。重新生成变量声明,以便xsl:choose语句属于声明范围,而不是相反。