当我运行以下代码时......
<?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 > 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 < 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
这怎么可能?
我是否以错误的方式声明变量width
和height
?
感谢您的帮助。
答案 0 :(得分:2)
您可以声明变量高度,例如:
<xsl:variable name="height">
<xsl:choose>
<xsl:when test="datei/meta/@width > datei/meta/@height">
<xsl:value-of select="'450'"/>
</xsl:when>
<xsl:when test="datei/meta/@width < 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[. > ../@height]" mode="width">600</xsl:template>
<xsl:template match="@width[. < ../@height]" mode="width">600</xsl:template>
<xsl:template match="@width" mode="width">600</xsl:template>
等
模板规则是XSLT中使用最少的部分。
答案 2 :(得分:1)
这是XSLT变量范围的问题。您已将变量声明在您要使用它们的范围之外。重新生成变量声明,以便xsl:choose语句属于声明范围,而不是相反。