2

我尝试创建一个变量,我可以在以后的模板中使用它:

<xsl:variable name="fc">
    <xsl:choose>
        <xsl:when test="self::node()='element1'">gray</xsl:when>
        <xsl:otherwise>red</xsl:otherwise>
    </xsl:choose>
</xsl:variable>

不幸的是,它不起作用。

<xsl:template match="element1">
    <h1><font color="{$fc}"><xsl:value-of select="self::node()"/></font></h1>
</xsl:template>

我究竟做错了什么?

这是广泛的代码:

XML:

<root 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.test.com scheme.xsd" xmlns="http://www.test.com" xmlns:tst="http://www.test.com">
 <elementA>
    <elementB tst:name="name">
        <elementC tst:name="name">
            <element1> Test1 </element1>
            <element2> Test2 </element2>
         </elementC >
    </elementB> 
  </elementA>    
</root>

所有元素都是合格的,并且是名称空间“ http://www.test.com ”的一部分。

XSLT:

<xsl:template match="/">
<html>
<body><xsl:apply-templates select="tst:root/tst:elementA/tst:elementB/tst:elementC/tst:element1"/>
</body>
</html>

</xsl:template>
<xsl:variable name="var_fc">
<xsl:choose>
    <xsl:when test="local-name(.)='tst:element1'">gray</xsl:when>
    <xsl:otherwise>red</xsl:otherwise>
</xsl:choose>
</xsl:variable>

<xsl:template match="tst:element1">
<h2><font color="{$var_fc}"><xsl:value-of select="self::node()"/></font></h2>
</xsl:template>

结果,element1 应该变成灰色,但它总是变成红色。

4

5 回答 5

1

您不能为此使用变量,因为 an 的内容xsl:variable在定义时只评估一次,而您希望在每次引用变量时评估一些逻辑,在引用点的当前上下文中。

相反,您需要一个模板,或者是一个命名的模板:

<xsl:template name="fc">
  <xsl:choose>
    <xsl:when test="local-name()='element1'">gray</xsl:when>
    <xsl:otherwise>red</xsl:otherwise>
  </xsl:choose>
</xsl:template>

或(更好)一对具有模式的匹配模板,让模板匹配器完成工作:

<!-- match any node whose local name is "element1" -->
<xsl:template mode="fc" match="node()[local-name() = 'element1']">gray</xsl:template>

<!-- match any other node -->
<xsl:template mode="fc" match="node()">red</xsl:template>

当你想使用这个逻辑时:

<h1>
  <font>
    <xsl:attribute name="color">
      <xsl:apply-templates select="." mode="fc" />
    </xsl:attribute>

看到您tst在样式表中映射了前缀,您可以直接检查名称而不是使用local-name()谓词:

<xsl:template mode="fc" match="tst:element1">gray</xsl:template>
<xsl:template mode="fc" match="node()">red</xsl:template>
于 2014-01-14T13:03:29.717 回答
1

XSLT 变量设计为不可更改。实际上它们可以被命名为常量。如果您的变量 fc 是全局创建的,它将使用根元素进行选择。您必须在实际模板中使用选择来针对当前元素进行测试。如果您只想定义一次“红色”和“灰色”,请创建两个仅包含该文本内容的变量,并使用这些变量代替选择中的纯文本。

于 2014-01-14T11:50:33.493 回答
0

我想而不是test="self::node()='element1'"你想要test="self::element1"or test="local-name(.) = 'element1'"

于 2014-01-14T12:18:50.190 回答
0

您的代码中还有一些其他错误:

(1) self::node() = 'element1'

测试元素的内容是否为“element1”,而不是其名称是否为“element1”

(2) local-name(.)='tst:element1'

永远不会为真,因为节点的本地名称从不包含冒号。

有经验的用户通常会使用模板规则编写此代码:

<xsl:template mode="var_fc" match="tst:element1">gray</xsl:template>
<xsl:template mode="var_fc" match="*">red</xsl:template>

接着

<xsl:apply-templates select="." mode="var_fc"/>
于 2014-01-14T14:22:59.293 回答
0

也许这是一个错字:

<xsl:when test=self::node()='element1'">gray</xsl:when>

应该:

<xsl:when test="self::node()='element1'">gray</xsl:when>

缺少报价。

于 2014-01-14T12:06:18.530 回答