xpath中xsl param的用法

时间:2016-03-22 02:22:11

标签: xml xslt xpath vxml

我将param数组$gen定义为:

<xsl:variable name="inline-array">
    <item>western</item>
    <item>Romance</item>
    <item>Adventure</item>
    <item>Drama</item>
    <item>Comedy</item>
    <item>Horror</item>
    <item>Action</item>
</xsl:variable>
<xsl:param name="gen" select="document('')/*/xsl:variable[@name='inline-array']/*"/>

我想通过XSLT将XML传输到VXML。 当我在Xpath

中使用它时,参数$gen$gen2无法选择该值
<xsl:value-of select>:
    <filled namelist="MovieSummary">
      <if cond="MovieSummary == '{$gen[1]}'">
        <prompt>
            <xsl:value-of select ="//genre[.='western']/../title"/>. <xsl:value-of select ="//genre[.='western']/../summary"/>
        </prompt>
    <xsl:for-each select="$gen[position()>1]">        
        <xsl:variable name="gen2"><xsl:value-of select="."/></xsl:variable>
        <elseif cond="MovieSummary == '{$gen2}'"/>
        <prompt>
            <xsl:value-of select ="//genre[.='$gen2']/../title"/>. <xsl:value-of select ="//genre[.='$gen2']/../summary"/>
        </prompt>   
    </xsl:for-each>
 <else/>
 </if> 
 </filled>

当我使用$gen2代替&#34; Romance&#34;时,它无法选择该值或其他字符串。但cond="MovieSummary == '{$gen[1]}'"效果很好。 它只能生成如下内容:

  <if cond="MovieSummary == 'western'">`enter code here`
    <prompt>Range Feud. 
    Clint Turner is arrested for the murder of his girlfriend Judy's      
    father, a rival rancher who was an enemy of his own father.
    </prompt>
    <elseif cond="MovieSummary == 'Romance'"/>
    <prompt>. </prompt>
     <else/>
  </if>

我试过了:

select ="//genre[.=$gen2]/../summary"; 
select ="//genre[.={$gen2}]/../summary"; 
select ="//genre[.='{$gen2}']/../summary"

全部失败。

1 个答案:

答案 0 :(得分:2)

指示:

<xsl:for-each select="$gen[position()>1]">

将您置于$gen的上下文中。从这个上下文,表达式:

<xsl:value-of select ="//genre[.='$gen2']/../title"/>

不选择任何内容,因为//从当前文档的根开始 - 但genre位于另一个文档altogeher中。

您需要将上下文更改回已处理的XML文档,以便解决其中的节点。

注意:在XSLT 2.0中,key()函数可以直接选择另一个文档中的节点,而无需更改整体上下文。