xpath表达式中的变量

时间:2013-04-11 08:36:29

标签: xslt xpath xslt-2.0

在xpath表达式中使用xsl:变量是不可能的?我确信我的变量具有正确的值。尝试过它作为字符串和数字。第一个工作,但第二个选择所有内容节点,而不只是索引4的节点。

<xsl:apply-templates select="data/contents[4]/content" >
<xsl:apply-templates select="data/contents[$myVariable]/content" >

编辑

    <xsl:variable name="dayOfWeekIndex">    
        <xsl:choose>    
            <xsl:when test="lower-case($dayOfWeek) = 'monday'">
                <xsl:value-of select="number(1)" />
            </xsl:when>
            <xsl:when test="lower-case($dayOfWeek) = 'tuesday'">
                <xsl:value-of select="number(2)" />
            </xsl:when>
            <xsl:when test="lower-case($dayOfWeek) = 'wednesday'">
                <xsl:value-of select="number(3)" />
            </xsl:when>
            <xsl:when test="lower-case($dayOfWeek) = 'thursday'">
                <xsl:value-of select="number(4)" />
            </xsl:when>
            <xsl:when test="lower-case($dayOfWeek) = 'friday'">
                <xsl:value-of select="number(5)" />
            </xsl:when>
            <xsl:when test="lower-case($dayOfWeek) = 'saturday'">
                <xsl:value-of select="number(6)" />
            </xsl:when>
            <xsl:when test="lower-case($dayOfWeek) = 'sunday'">
                <xsl:value-of select="number(7)" />
            </xsl:when>
        </xsl:choose>   
    </xsl:variable>

4 个答案:

答案 0 :(得分:3)

重要的是如何设置变量或参数,例如与

<xsl:variable name="index" select="4"/>
<xsl:apply-templates select="data/contents[$index]/content"/>

它应该有效(即处理第四个contents),

<xsl:variable name="index">4</xsl:variable>
<xsl:apply-templates select="data/contents[$index]/content"/>

它不起作用,因为谓词表达式不是xs:integer类型,它是一个非空的节点序列。

答案 1 :(得分:1)

<xsl:variable name="dayOfWeekIndex">    
    <xsl:choose>    
        <xsl:when test="lower-case($dayOfWeek) = 'monday'">
            <xsl:value-of select="number(1)" />
        </xsl:when>
        ....

具有内容但没有<xsl:variable>属性的as会将变量设置为“临时树”,而不是数字,因此谓词[$dayOfweekIndex]被视为布尔谓词而不是对节点'position()的限制。您需要将as="xs:integer"添加到xsl:variable标记,以强制变量具有正确的类型。

或者,在XPath 2.0中使用select代替if构造:

<xsl:variable name="dayOfWeekIndex" as="xs:integer" select="
    if (lower-case($dayOfWeek) = 'monday') then 1 else
    if (lower-case($dayOfWeek) = 'tuesday') then 2 else
    .....
    if (lower-case($dayOfWeek) = 'sunday') then 7 else
    0" />

答案 2 :(得分:1)

正如其他人所注意到的那样,在XSLT 2.0中指定变量的类型确实很重要。

除此之外,此转换还显示了如何使用XPath one-liner生成所需结果

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema">
 <xsl:output method="text"/>

 <xsl:variable name="vWeekDays" as="xs:string+" select=
 "('monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday')"/>


 <xsl:template match="/">
  <xsl:variable name="vdayOfWeek" select="'Friday'"/>

  <xsl:sequence select="index-of($vWeekDays, lower-case($vdayOfWeek))"/>
 </xsl:template>
</xsl:stylesheet>

将此转换应用于任何XML文档(未使用)时,会生成所需的正确结果

5

答案 3 :(得分:0)

进行此转换时

<?xml version='1.0'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml"/>
<xsl:variable name="para1" select="chapter/para"/>
<xsl:template match="chapter">
    <p><xsl:apply-templates select="$para1"/></p>
</xsl:template>

</xsl:stylesheet>

在XML 下面运行

<?xml version="1.0"?>
<chapter>
<para>This is para</para>
</chapter>

获取输出

<?xml version='1.0' ?>
<p>This is para</p>