xslt和xpath:匹配两个节点属性
给定以下xml:xslt和xpath:匹配两个节点属性,xslt,Xslt,给定以下xml: <student studentID="001"> <dateOfBirth> 1-1-1990 </dateOfBirth> <name> Ayse Ozer </name> <sex> F </sex> <takes> CMPE351 </takes> <takes> CMPE111 </takes>
<student studentID="001">
<dateOfBirth> 1-1-1990 </dateOfBirth>
<name> Ayse Ozer </name>
<sex> F </sex>
<takes> CMPE351 </takes>
<takes> CMPE111 </takes>
<takes> CMPE418 </takes>
</student>
<student studentID="002">
<dateOfBirth> 2-2-1992 </dateOfBirth>
<name> Bircan Korkmaz </name>
<sex> F </sex>
<takes> CMPE418 </takes>
<takes> CMPE111 </takes>
<takes> CMPE352 </takes>
</student>
<course courseCode="CMPE351">
<courseName>
Database systems I
</courseName>
<description>
First course in databases
</description>
</course>
<course courseCode="CMPE111">
<courseName>
Introduction to C
</courseName>
<description>
First course in programming
</description>
</course>
<course courseCode="CMPE352">
<courseName>
Database systems II
</courseName>
<description>
Second course in databases
</description>
</course>
<course courseCode="CMPE418">
<courseName>
Internet Programming
</courseName>
<description>
Programming for the Internet.
</description>
</course>
我编写了以下xsl代码:
<xsl:template match = "school">
<head>
<title>Student</title>
</head>
<body>
<p>Courses Taken By Students:</p>
<xsl:for-each select = "student">
<ul>
<li><xsl:value-of select = "name"/> </li>
<xsl:for-each select = "takes">
<ul>
<li><xsl:value-of select="text()" />
<xsl:value-of select = "../../course[@courseCode=text()]/courseName"/> </li>
</ul>
</xsl:for-each>
</ul>
</xsl:for-each>
</body>
</xsl:template>
学生
学生修读的课程:
* Ayse Ozer
o CMPE351 Database systems I
o CMPE111 Introduction to C
* Bircan Korkmaz
o CMPE418 Internet Programming
o CMPE111 Introduction to C
-
关于文本()上一行的问题
问题在于空格:
<takes> CMPE351 </takes>
CMPE351
应该是:
<takes>CMPE351</takes>
CMPE351
我会尽力补偿。。。路上的例子。。。
为了避免很多问题(并提高性能),我还将使用xsl索引
修正(警告-它不适用于中间有多个空格的课程代码,但这似乎不太可能):
-
使用(位于顶部)xsl索引:
<xsl:key name="courses" match="/school/course" use="@courseCode"/>
问题在于空格:
<takes> CMPE351 </takes>
CMPE351
应该是:
<takes>CMPE351</takes>
CMPE351
我会尽力补偿。。。路上的例子。。。
为了避免很多问题(并提高性能),我还将使用xsl索引
修正(警告-它不适用于中间有多个空格的课程代码,但这似乎不太可能):
-
使用(位于顶部)xsl索引:
<xsl:key name="courses" match="/school/course" use="@courseCode"/>
就在您得到好答案之前,我已经准备好了这个例子。因为这只是一个稍微不同的方法,我想我无论如何都会发布它
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="no" encoding="UTF-8" omit-xml-declaration="yes" />
<xsl:key name="courses" match="course" use="@courseCode"/>
<xsl:template match="school">
<html>
<body>
<p>Courses taken by:</p>
<ul>
<xsl:apply-templates select="student"/>
</ul>
</body>
</html>
</xsl:template>
<xsl:template match="student">
<li>
<xsl:value-of select="name"/>
<ul>
<xsl:apply-templates select="takes"/>
</ul>
</li>
</xsl:template>
<xsl:template match="takes">
<li>
<xsl:value-of select="."/>
<xsl:value-of select="key('courses', normalize-space(.))/courseName"/>
</li>
</xsl:template>
</xsl:stylesheet>
参加的课程:
就在您得到好答案之前,我已经准备好了这个例子。因为这只是一个稍微不同的方法,我想我无论如何都会发布它
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="no" encoding="UTF-8" omit-xml-declaration="yes" />
<xsl:key name="courses" match="course" use="@courseCode"/>
<xsl:template match="school">
<html>
<body>
<p>Courses taken by:</p>
<ul>
<xsl:apply-templates select="student"/>
</ul>
</body>
</html>
</xsl:template>
<xsl:template match="student">
<li>
<xsl:value-of select="name"/>
<ul>
<xsl:apply-templates select="takes"/>
</ul>
</li>
</xsl:template>
<xsl:template match="takes">
<li>
<xsl:value-of select="."/>
<xsl:value-of select="key('courses', normalize-space(.))/courseName"/>
</li>
</xsl:template>
</xsl:stylesheet>
参加的课程:
在我的回答中,我假设/school是根节点,其他所有内容都直接位于根节点之下……此外,建议您使用标准xml。这个额外的空白会伤害你,日期应该遵循正常的布局;“2-2-1992”的诞生日期应该是“1992-02-02”。在我的回答中,我假设/school是根节点,其他所有内容都直接位于根节点之下……此外,建议您使用标准xml。这个额外的空白会伤害你,日期应该遵循正常的布局;“1992年2月2日”的出生日期应该是“1992年2月2日”。你是对的,在takes节点中的问题空间。我还将text()改为current(),然后它就可以正常工作了。但是,您的代码也非常适用于空格thx。您在takes节点中的问题空格是正确的。我还将text()改为current(),然后它就可以正常工作了。但是你的代码也非常适用于空格thx。这并没有什么不同。。。规范化空间和xsl:key的使用相同-唯一的区别是xsl:variable的使用,这不是一个重要的区别。没错,但我想到的一个细微的区别是xsl:for each与xsl:template的最初使用。这并不是很不同。。。规范化空间和xsl:key的使用是一样的——唯一的区别是xsl:variable的使用,这不是一个重要的区别。没错,但我想到的一个细微的区别是xsl:for each与xsl:template的最初使用。