代码之家  ›  专栏  ›  技术社区  ›  Andrew Hare

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

  •  4
  • Andrew Hare  · 技术社区  · 16 年前

    我需要能够在包含另一个变量的不同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 回复  |  直到 16 年前
        1
  •  4
  •   Dimitre Novatchev    16 年前

    正如其他人所指出的,向导入样式表中定义的全局变量添加默认值不能使用相同的变量名完成 这是因为当前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 任何符合其定义的地方。这个 $v电子邮件 导入样式表中的变量根本不会被直接使用 .

        2
  •  0
  •   annakata    16 年前

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

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