2

难道不能在 xpath 表达式中使用 xsl:variables 吗?我确信我的变量具有正确的值。已尝试将其作为字符串和数字。第一个有效,但第二个选择所有内容节点,而不仅仅是索引为 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

4 回答 4

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"/>

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

于 2013-04-11T09:11:13.460 回答
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" />
于 2013-04-11T09:56:06.370 回答
1

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

除此之外,此转换还展示了如何使用 XPath 单线生成所需的结果

<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
于 2013-04-12T03:16:09.773 回答
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>
于 2013-04-11T09:00:30.757 回答