select = element [@attribute ='$ variable']的XSLT xsl值返回空

时间:2016-04-20 09:57:24

标签: xml variables xslt

我知道问题已经多次回答,但由于某种原因对我不起作用。 所以我想要实现的是通过使用它的属性值输出元素的内容来访问它,而不是声明属性的特定值,如:

<xsl:value-of select="title[@attribute='value']"/>

这适用于我的代码,但我想使用类似的变量:

<xsl:value-of select="title[@attribute='$variable']"/>

但无论我做什么或尝试不同的方式 如:

<xsl:value-of select="//title[@attribute='$variable']"/>

<xsl:value-of select="//title[@attribute= $variable]"/>

没有任何东西,我没有从撒克逊人那里得到任何错误,所以我不知道最近会发生什么。

xml文件

  <root>
   <documentname>
      <element>text</element>
        .
        .
      <element1 atributename1="VALUE1">text</element1>
        .
        .
      <element95 atributename1="value1"  secondatribute="0001"/>
         .
         .
     </documentname>
    </root>

xsl文件

    <xsl:template match="element95 ">
       <xsl:choose>
        <xsl:when test="@atributename1">      
        <xsl:variable name="keyb" select="substring(@secondatribute,1,4)"/>
        <xsl:variable name="keyval" select="substring(@atributename1, 0,6)" />
        <xsl:variable name="keyc">
        <xsl:value-of select="'upper-case($keyval)'"/></xsl:variable>
        <a href="#{$keyc}"><xsl:value-of select="($keyb)"/>.0(<xsl:value-of select="//element1 [@atributename1=($keyc)]"/>)</a> 
   </xsl:when>
 </xsl:choose>

输出

1.0()

所需的输出:

1.0(text)

2 个答案:

答案 0 :(得分:0)

您的问题归结为字符串文字

<xsl:value-of select="//title[@attribute='$variable']"/>

说“我希望将该属性的值设为实际字符串'$ variable'” 所以你想使用:

<xsl:value-of select="//title[@attribute= $variable]"/>

但是在设置变量时你也犯了这个错误:

     <xsl:variable name="keyc">
    <xsl:value-of select="'upper-case($keyval)'"/></xsl:variable>

使用:

        <xsl:variable name="keyc">
    <xsl:value-of select="upper-case($keyval)"/></xsl:variable>

或更具可读性

 <xsl:variable name="keyc" select="upper-case($keyval)"/>

通常在xslt中读取字符串处理和扩展。

答案 1 :(得分:0)

以下是您的XSL代码的一些问题:

  • $keyc变量已设置为文字字符串'upper-case($keyval)'。删除单引号以使其被识别为XPath表达式并进行正确评估。

  • 您的演示中的
  • substring(@atributename1, 0,6)会返回'value'。目前还不清楚您要在此处实现的目标,但这肯定会导致//element1[@atributename1=($keyc)]以后找不到匹配项,因为在{1}}中没有atributename1的值等于'value' XML示例。您希望将substring()参数设置为更高的长度,或者在将substring()@atributename1进行比较时使用相同长度的$keyc