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