选择for-each循环中的特定条目?

时间:2016-01-28 13:45:50

标签: xml xslt-1.0

我有以下XSL脚本:

<xsl:for-each select="$AssignHistory/AssignmentHistory/*[name()=$week]/StudentItems/Item">
    Student (or assistant): <xsl:value-of select="Name"/><br />
</xsl:for-each>

实际的XML StudentItems中将包含不同数量的项目。之一:

1
7
14
21

如果有7个,那么我想显示这样的列表内容:

1
2 / 3
4 / 5
6 / 7

如果有14:

1
2 / 3
4 / 5
6 / 7
8
9 / 10
11 / 12
13 / 14

最后,如果有21:

1
2 / 3
4 / 5
6 / 7
8
9 / 10
11 / 12
13 / 14
15
16 / 17
18 / 19
20 / 21

目前我正在获取各种各样的&#34;列表&#34;名字(可以理解),但我能做到吗? XML内容示例:

    <StudentItems>
        <Item>
            <Name Counsel="10">Matthew 1</Name>
            <Type>Bible Reading (Main)</Type>
        </Item>
        <Item>
            <Name Counsel="44">John 2</Name>
            <Type>#1 Student (Main)</Type>
        </Item>
        <Item>
            <Name>Robert 3</Name>
            <Type>Assistant</Type>
        </Item>
        <Item>
            <Name Counsel="38">Rachel 4</Name>
            <Type>#2 Student (Main)</Type>
        </Item>
        <Item>
            <Name>Aimie 5</Name>
            <Type>Assistant</Type>
        </Item>
        <Item>
            <Name Counsel="48">Julie 6</Name>
            <Type>#3 Student (Main)</Type>
        </Item>
        <Item>
            <Name>Diana 7</Name>
            <Type>Assistant</Type>
        </Item>
        <Item>
            <Name Counsel="5">Gordon 8</Name>
            <Type>Bible Reading (Aux)</Type>
        </Item>
        <Item>
            <Name Counsel="39">Sadie 9</Name>
            <Type>#1 Student (Aux)</Type>
        </Item>
        <Item>
            <Name>Bethany 1</Name>
            <Type>Assistant</Type>
        </Item>
        <Item>
            <Name Counsel="38">Zoe 2</Name>
            <Type>#2 Student (Aux)</Type>
        </Item>
        <Item>
            <Name>Angela 3</Name>
            <Type>Assistant</Type>
        </Item>
        <Item>
            <Name Counsel="37">Mary 4</Name>
            <Type>#3 Student (Aux)</Type>
        </Item>
        <Item>
            <Name>Kate 5</Name>
            <Type>Assistant</Type>
        </Item>
    </StudentItems>

所以我提到了一个数字,我指的是列表中的项目/名称。感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

我建议不要:

<xsl:for-each select="$AssignHistory/AssignmentHistory/*[name()=$week]/StudentItems/Item">
    Student (or assistant): <xsl:value-of select="Name"/><br />
</xsl:for-each>
你这样做:

<xsl:apply-templates select="$AssignHistory/AssignmentHistory/*[name()=$week]/StudentItems"/>

然后添加这些模板:

<xsl:template match="StudentItems">
    <xsl:apply-templates select="Item[not((position() - 1) mod 7) or ((position() - 1) mod 7) mod 2] "/>
</xsl:template>

<xsl:template match="Item">
    <xsl:value-of select="Name"/>
    <xsl:if test="(position() - 1) mod 4">
        <xsl:apply-templates select="following-sibling::Item[1]" mode="follower"/>
    </xsl:if>
    <br/>
</xsl:template>

<xsl:template match="Item" mode="follower">
    <xsl:text> / </xsl:text>
    <xsl:value-of select="Name"/>
</xsl:template>
  

调整它是否需要做很多工作才能在1之前就行了   “主要”和8号线之前它说“辅助等级1”并且在   在15之前它说“辅助等级2”?

怎么样:

<xsl:template match="StudentItems">
    <xsl:apply-templates select="Item[position() mod 7 = 1]" mode="leader"/>
</xsl:template>

<xsl:template match="Item" mode="leader">
    <xsl:choose>
        <xsl:when test="position() = 1">Main </xsl:when>
        <xsl:when test="position() = 2">Auxiliary Class 1 </xsl:when>
        <xsl:otherwise>Auxiliary Class 2 </xsl:otherwise>
    </xsl:choose>
    <xsl:value-of select="Name"/>
    <br/>
    <xsl:apply-templates select="following-sibling::Item[position() &lt;= 6 and position() mod 2]"/>
</xsl:template>

<xsl:template match="Item">
    <xsl:value-of select="Name"/>
    <xsl:apply-templates select="following-sibling::Item[1]" mode="follower"/>
    <br/>
</xsl:template>

<xsl:template match="Item" mode="follower">
    <xsl:text> / </xsl:text>
    <xsl:value-of select="Name"/>
</xsl:template>

答案 1 :(得分:0)

如果我理解正确,如果有助理,那么你想要学生旁边的名字。如果没有助手,那么你只想要学生。为什么不围绕<br/>使用关于类型的if语句?例如,像这样:

<xsl-if test="Type='Assistant">
    <xsl:value-of select="Name"/>
</xsl:if>
<xsl-if test="Type='Student'"><br/>
    <xsl:value-of select="Name"/>
</xsl:if>