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

在XSLT中检查更高优先级变量内的变量值,xslt,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:variabl

我需要能够检查变量的“当前”值在包含另一个变量的不同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>

bar@foo.com
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>

foo@bar.com

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

您不能直接执行您想要的操作,必须设置第二个变量


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

正如其他人所指出的,向导入样式表中定义的全局变量添加默认值,不能使用相同的变量名来完成。这是因为当前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
的定义方式是,如果它是长度至少为1的字符串,则它具有变量
$vEmail
(在导入的样式表中定义)的值,否则为所需的默认值


使用此技术,可以在定义之后的任何地方使用如此定义的
$vMyEmail
。导入样式表中的
$vEmail
变量将不会直接使用

@annakata:我认为您误解了这个问题。当它不询问如何为模板的参数提供默认值时,它是有意义的。请参阅我答案中的具体代码。干杯,@Dimitre-但你描述的正是第二个变量计划,我认为很明显,第一个变量在第二个变量的定义范围内直接用于进口商,而不管它在其他地方没有使用。模板解决方案上的参数更简单,而且可能是正确的。@annakata-我认为这是两种不同的方案,每种方案都有自己的用途。然而,OP在评论中指出,他真正想要的是默认一个全局变量。谢谢——这就是我想要的答案。