我不完全确定XSLT是否可行,我的讲师不知道我在说什么,所以如果有人可以提供帮助,谢谢!
我有一个XML文件,其中包含作者列表,每个作者都有一个唯一的ID,还有一个书籍列表,每个书籍都有一个IDREF作为其值的子元素。该文件的布局如下:
<library>
<authors>
<author id="a001">
<name>Joyce</name>
</author>
</authors>
<books>
<book id="b001">
<name>Illiad</name>
<authorID>a001</authorID>
</book>
</books>
</library>
我正在尝试写出所有图书的列表,并使用authorID值获取有关作者的信息。
XSLT:
<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title>XSLT Test</title>
</head>
<body>
<xsl:for-each select="//book">
<div style="display:block; background-color:#999; padding:2px; margin:2px;">
<h2><xsl:value-of select="name"/></h2>
<p><xsl:value-of select="synopsis"/></p>
<ul>
<li>Author: <xsl:value-of select="//author[@id='X']/name"/></li>
</ul>
</div>
</xsl:for-each>
</body>
</html>
通过用一个值替换X,例如a001,我可以恢复Joyce但是如何在这里使用authorID值,以便系统可以很好地扩展?
答案 0 :(得分:6)
避免使用//
运算符。它往往没有最好的性能特征,特别是当你像它一样嵌套它时(for-each //, value-of //
)。
使用规范的XPath表达式,如下所示。他们表现得更好:
<xsl:for-each select="/library/books/book">
<div style="display:block; background-color:#999; padding:2px; margin:2px;">
<h2><xsl:value-of select="name"/></h2>
<p><xsl:value-of select="synopsis"/></p>
<ul>
<li>
<xsl:text>Author: </xsl:text>
<!-- use the current() function to access the current node (book) -->
<xsl:value-of select="
/library/authors/author[@id=current()/authorID]/name
"/>
</li>
</ul>
</div>
</xsl:for-each>
更好的是,声明一个XSL密钥:
<xsl:key name="kAuthorById" match="author" use="@id" />
并使用key()
函数访问它:
<xsl:value-of select="key('kAuthorById', authorID)/name" />
此方法具有最佳性能,尤其是当输入文档变大时。
您还应该避免<xsl:for-each>
。尝试编写模板并使用模板匹配:
<xsl:template match="library">
<body>
<xsl:apply-templates select="books" />
</body>
</xsl:template>
<xsl:template match="books">
<h1>List of Books</h1>
<xsl:apply-templates select="book" />
</xsl:template>
<xsl:template match="book">
<div style="display:block; background-color:#999; padding:2px; margin:2px;">
<h2><xsl:value-of select="name"/></h2>
<p><xsl:value-of select="synopsis"/></p>
<ul>
<li>Author: <xsl:value-of select="key('kAuthorById', authorID)/name"/></li>
</ul>
</div>
</xsl:template>
答案 1 :(得分:0)
您可以使用变量
<xsl:variable name="author" select="authorID/text()" />
然后在谓词中使用它
<xsl:value-of select="//author[@id=$author]/name"/>
答案 2 :(得分:0)
<xsl:template match="book">
<xsl:variable name="authorID" select="@authorID"/>
<div>
<h2><xsl:value-of select="name"/></h2>
<p><xsl:value-of select="synopsis"/></p>
<xsl:for-each select="/library/authors/author[@id=$authorID]">
<ul>
<li>Author: <xsl:value-of select="name"/></li>
</ul>
</xsl:for-each>
</div>
</xsl:template>