XSLT任务准备考试

时间:2014-08-22 12:10:35

标签: xml xslt-2.0

关于XSLT的问题,我需要你的帮助。这是我考试准备的一部分。 提供的信息如下: 图1中的XML文档的HTML呈现。请注意组和人员 在每个组中,以与XML文档中相同的顺序出现。在每个结束时 工作人员入职,还有其他学术组成的标识符 所属。这些超链接到相应组部分的开头。 应用XSLT的最终结果必须是: enter image description here

XML文件如下:

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="research.xsl"?>
<ResearchGroups xmlns="http://www.essex.ac.uk/ce832">
<Group name="Intelligent Systems Group" id="ISG"> The Intelligent
Systems Group pursues internationally-leading research in a wide
range of intelligent systems. </Group>
<Group name="Robotics" id="RBT"> The Essex robotics group is one of
the largest mobile robotics groups in the UK. </Group>
<Staff name="Callaghan, Vic" title="Professor" groups="ISG RBT">
Intelligent environments and robotics. </Staff>
<Staff name="Gu, Dongbing" title="Dr" groups="RBT"> Multi-agent
and distributed control systems. </Staff>
</ResearchGroups>

我创建的.xsl文件如下:

<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:rg="http://www.essex.ac.uk/ce832"
xmlns="http://wwww.w3.org/1999/xhtml"
version="2.0">
<xsl:template match="/">
<html>
<head> <title>Research Groups</title> </head>
<body> <xsl:apply-templates select="//rg:Group"/> 
</body>
</html>
</xsl:template>
<xsl:template match="rg:Group">
<xsl:variable name="ID" select="@id"/>
<h3> <a name="{$ID}"> <xsl:value-of select="@name"/> </a> </h3>
<p> <xsl:value-of select="text()"/> </p>
    <xsl:for-each select="//rg:Staff">
        <xsl:variable name="string" select="@groups" />
        <xsl:value-of select="$string" />
        <xsl:variable name="stringList" select="tokenize($string, ' ')" />
        <xsl:variable name="staffName" select="@name" />
        <xsl:variable name="description" select="text()" />
        <xsl:for-each select="$stringList">
        <xsl:variable name="item" select="." />
        <xsl:choose>
        <xsl:when test="matches($item, $ID)">
        <ul>
                    <li>
                    <xsl:value-of select="$staffName" />: <xsl:value-of select="$description" />
                    <xsl:value-of select="$ID" />
                    </li>
                    </ul>
        </xsl:when>
        </xsl:choose>
        </xsl:for-each>
    </xsl:for-each>
    </xsl:template>
    </xsl:stylesheet>

我遇到的问题是部分&#34;在每个工作人员条目的末尾,都有学者也属于的其他组的标识符。这些超链接到相应组部分的开头。&#34;因为第一个工作人员属于两个组,而第二个工作人员不属于两个组。此时,显示的信息是当前组的ID,而不是预期的。第一个人属于谁组 - ISG和RBT。当他们的名字出现在第一组中时,必须显示另一组的ID并包含指向第二组的链接 - Robotics。如果此人出现在第二组中,则同样适用。如果此人不属于多个组,则不必显示链接。 我想我必须从stringList变量中取出每个值并进行比较。问题是我不知道该怎么做。 我希望有人可以帮助我!提前谢谢。

P.S。感谢Mark Veenstra的解决方案。有人可以提供另一种解决方案吗?

1 个答案:

答案 0 :(得分:0)

下一个XSLT应该完成这项工作:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:rg="http://www.essex.ac.uk/ce832" xmlns="http://wwww.w3.org/1999/xhtml" exclude-result-prefixes="rg">
    <xsl:output method="html" encoding="UTF-8" indent="yes"/>

    <xsl:template match="/">
        <html>
            <head>
                <title>Research Groups</title>
            </head>
            <body>
                <xsl:apply-templates select="rg:ResearchGroups/rg:Group"/>
            </body>
        </html>
    </xsl:template>

    <xsl:template match="rg:Group">
        <xsl:variable name="ID" select="@id"/>
        <h3>
            <a name="{$ID}">
                <xsl:value-of select="@name"/>
            </a>
        </h3>
        <p>
            <xsl:value-of select="."/>
        </p>
        <ul>
            <xsl:apply-templates select="ancestor::rg:ResearchGroups/rg:Staff[contains(@groups, $ID)]">
                <xsl:with-param name="ID" select="$ID" />
            </xsl:apply-templates>
        </ul>
    </xsl:template>

    <xsl:template match="rg:Staff">
        <xsl:param name="ID" />
        <li>
            <xsl:value-of select="concat(@name, ': ', .)" />
            <xsl:for-each select="tokenize(translate(@groups, $ID, ''), ' ')">
                <xsl:if test="normalize-space(.) != ''">
                    <a href="#{.}"><xsl:value-of select="." /></a>
                </xsl:if>
            </xsl:for-each>
        </li>
    </xsl:template>
</xsl:stylesheet>