在XSLT中检查高优先级变量中的变量值

时间:2008-12-30 17:22:56

标签: xslt

我需要能够检查变量的“当前”值是否在包含另一个的不同xslt中的同一变量的重新声明中。

main.xslt:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:import href="other.xslt"/>
    <xsl:variable name="email">
        <xsl:if test="string-length($email) = 0">
            bar@foo.com
        </xsl:if>
    </xsl:variable>
    <xsl:template match="/">
        <Email>
            <xsl:value-of select="$email"/>
        </Email>
    </xsl:template>
</xsl:stylesheet>

other.xslt:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:variable name="email">foo@bar.com</xsl:variable>
</xsl:stylesheet>

我想要做的是能够检查低优先级变量的值,看看我是否需要在当前xslt的变量中覆盖它。 (免责声明 - 当前代码恶意崩溃)

2 个答案:

答案 0 :(得分:4)

正如其他人所说,在导入的样式表中定义的全局变量中添加默认值不能使用相同的变量名称。这是因为在当前xslt样式表中定义的具有该名称的变量具有比导入样式表中的变量更高的优先级,并且仅使用前者(您不能在较低优先级样式表中访问具有相同名称的变量)。

以下是添加默认的方法:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!--                                            -->
  <xsl:import href="other.xsl"/> 
<!--                                            -->
    <xsl:variable name="vMyEmail" select=
     "concat(substring('bar@foo.com', 1 div not($vEmail)), $vEmail)"
     />
<!--                                            -->
    <xsl:template match="/">
      <xsl:value-of select="$vMyEmail"/>
    </xsl:template>
</xsl:stylesheet>

请注意全局变量 $vMyEmail 的定义方式是它具有变量 $vEmail的值(在导入的样式表中定义)如果这是一个长度至少为1的字符串,或者是所需的默认值 - 否则。

使用这种技术,人们将在其定义后的任何地方使用如此定义的$vMyEmail。导入的样式表中的$vEmail变量不会直接用于

答案 1 :(得分:0)

你不能直接做你想做的事,你必须设置第二个变量。

但我无法理解意图:如果这是基于模板的,你可以为任何param提供默认值(其行为与变量非常相似)。你说出这个问题的方式表明这对我来说是正确的方法,但是你能澄清这些模板是如何关联和使用的吗?