2012-02-18 71 views
2
<xsl:template match="/"> 
     <xsl:variable name="a" select="'a'"/> 
     <xsl:variable name="b" select="'b'"/> 
     <xsl:variable name="c" select="'c'"/> 
     <xsl:variable name="result"> 
     <xsl:choose> 
      <xsl:when test="$a !=''"> 
      <xsl:value-of select="$a"/> 
      </xsl:when> 
      <xsl:when test="$b !=''"> 
      <xsl:value-of select="$b"/> 
      </xsl:when> 
      <xsl:otherwise> 
      <xsl:value-of select="$c"/> 
      </xsl:otherwise> 
     </xsl:choose> 
     </xsl:variable> 

结果填充变量,在这里我使用了xsl选择语句。我只是想知道是否有其他有效或简单的方法来填充结果变量,基于与xsl选择相同的逻辑。填充用XSL变量选择

像这样的事情

<xsl:variable name="result" select="$a | $b | $c" /> 

以上会为节点集工作,而不是变量。任何输入?xsl 1.0

回答

2

像这样的事情

<xsl:variable name="result" select="$a | $b | $c" /> 

以上会为节点集工作,而不是变量。任何输入?xsl 1.0

这是错误的!以上result变量被定义为包含三个节点集的并集 - 不仅仅是其中的一个,取决于它们中的一些是否为空。

在这种情况下的正确的XPath表达式是

$a | $b[not($a)] | $c[not($a | $b)] 

当这三个变量不节点集,但字符串并且如果这些字符串值可以具有任何长度(未只有1长度),相应的XPath表达式是相似的:

concat($a, 
     substring($b, 1 div ($a = '')), 
     substring($c, 1 div (concat($a, $b) = '')) 
     ) 

在这里,我们使用发克拉说:

substring($s, $k)是空字符串''

每当

$k >= string-length($s) 

substring($s, 1) = $s 

另外:

1 div false() 

positive Infinity

false()在算术运算中使用时转换为0)。

和定义

positive Infinity > $k 

每一个整数$k

因此,

substring($s, 1 div $somethingFalse) = '' 

substring($s, 1 div $somethingTrue) = $s 

最后,如果它保证了三个变量$a$b$c可以有值只有单个字符,比我们只能用:

substring(concat($a, $b, $c), 1, 1) 
+0

谢谢迪米特雷。 Super for xslt 1.0。 – Suresh 2012-02-18 16:52:24

+0

@Maneesh:不客气。 – 2012-02-18 18:09:15

1

那么,如果变量绑定到节点集,然后$a | $b | $c产生这些节点集的联合,而不是一个替代品,所以我不知道你想解释什么,通过呈现该示例。

在您的第一个代码示例中,您有三个变量,其值为字符串类型,其中每个变量都包含单个字符,因此如果单个字符或空字符串是您所期望的并且您想要查找该字符,则可以执行<xsl:variable name="result" select="substring(concat($a, $b, $c), 1, 1)"/>变量的“集合”中的第一个字符。但总的来说,XSLT 1.0可能需要详细的编码xsl:choose/when/otherwise

+0

谢谢马丁。忽略我关于节点集合的例子。 – Suresh 2012-02-18 14:19:10