在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>
答案 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>