XSL变量赋值/用法

时间:2015-05-06 21:22:53

标签: xml xslt

我有一个XML文件,我正在使用XSL处理以构建PDF。当我尝试使用XSL变量时,我遇到了一个问题。我不确定我是否在错误的范围内使用它,分配错误或者说错了。这是我目前的代码。

<xsl:template name="article-meta-details">
    <xsl:choose>
        <xsl:when test="/article-meta/oldedition = 1"> 
            <xsl:variable name="section_title" select="'Old'"/>
        </xsl:when>
        <xsl:otherwise>
            <xsl:variable name="section_title" select="'New'"/>
        </xsl:otherwise>
    </xsl:choose>
    <xsl:call-template name="subtitle">
    <xsl:value-of select="$section_title" />
</xsl:call-template>

这会产生以下错误:

  

XPST0008:尚未声明变量section_title

我尝试了另一个在不同线程上找到的解决方案,该解决方案表示在使用之前必须定义变量。我认为它是用xsl:param来定义它,但这对我产生了类似的结果。

  

XTSE0010:xsl:param必须立即在模板,函数或中   样式表

我尝试了上面的代码,并在variable个地方进行了以下更改。

<xsl:param name="section_title" select="'Old'"/>

如果有人可以请指出我做错了什么和/或如何解决它对我来说非常有用。感谢。

哦,这段代码的目标是复制这个功能......

<xsl:template name="article-meta-details">
    <xsl:call-template name="subtitle">
    <xsl:with-param name="text" select="'Old'"/>
</xsl:call-template>

3 个答案:

答案 0 :(得分:4)

错误消息表明您正在使用XSLT 2.0,因此您只需编写:

<html>
  <head>
    <style>
      body {color:blue;}
    </style>
  </head>
  <body>

答案 1 :(得分:3)

这是因为您正在使用过程语言接近变量声明。

XSLT已编译,因此需要确保您的变量存在或不存在。它看到你有条件地宣布它,并且它变得担心。

简单地使变量 value 成为条件,而不是变量的存在本身。

<xsl:variable name="section_title">
    <xsl:choose>
        <xsl:when test="/article-meta/oldedition = 1">Old</xsl:when>
        <xsl:otherwise>New</xsl:otherwise>
    </xsl:choose>
</xsl:variable>

答案 2 :(得分:2)

  

如果有人可以请指出我做错了什么

您的方法的主要问题是范围。当您定义这样的变量时:

<xsl:when test="/article-meta/oldedition = 1"> 
    <xsl:variable name="section_title" select="'Old'"/>
</xsl:when>

仅在您关闭xsl:when元素之前存在。同样,另一个变量仅存在于xsl:otherwise标记内。 (如果不是这样的话,两者会发生碰撞,具有相同的名称。)

  

和/或如何解决它

如果没有看到更广泛的情况,很难提出建议,但是你不可能做到这一点:

<xsl:template name="article-meta-details">
    <xsl:call-template name="subtitle">
        <xsl:with-param name="text">
            <xsl:choose>
                <xsl:when test="/article-meta/oldedition = 1">Old</xsl:when>
                <xsl:otherwise>New</xsl:otherwise>
            </xsl:choose>
    </xsl:call-template>
    <!-- more? -->
</xsl:template>