想象一下下面的XML
<?xml version="1.0" encoding="ISO-8859-1"?>
<bookstore>
<book>
<title lang="eng">Harry Potter</title>
<price>29.99</price>
</book>
<book>
<title lang="eng">Learning XML</title>
<price>39.95</price>
</book>
<book>
<title lang="eng">A book</title>
<price>39.95</price>
</book>
<book>
<title lang="eng">Another Book</title>
<price>39.95</price>
</book>
</bookstore>
我需要创建一个XSL样式表,在XHTML中显示这个XML文件,每行只有2本书。 XML文件中的书籍数量可能随时发生变化,因此XSL需要考虑到这一点。我认为这样做的一个解决方案是将数据放入表中,但是我无法绞尽脑汁想出一个有效的创建方法。可能的想法是执行模数2检查或将总书数除以2,但仍然无法得出如何编写这样来创建有效代码。以下是我在一个长列中一个接一个地显示所有书籍的初步解决方案。
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:template match="/">
<html>
<head>
<link rel="stylesheet" type="text/css" href="css/theStyle.css" />
</head>
<body onload="parent.alertsize(document.body.scrollHeight);">
<div>
<!-- <p><xsl:value-of select="count(//book)"/></p>-->
<xsl:for-each select="/bookstore/book">
<h4><xsl:value-of select='title' /></h4>
<p><xsl:value-of select='price' /></p>
<!--<xsl:if test="postion() mod 2 = 0">
<p>a mod 0</p>
</xsl:if>-->
</xsl:for-each>
</div>
</body>
</html>
</xsl:template>
任何提示/指针/解决方案都非常感谢。 (不一定需要表作为解决方案,我只是认为这可能是一个选项)
答案 0 :(得分:0)
<强>解决方案强>
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<head>
<link rel="stylesheet" type="text/css" href="css/theStyle.css" />
</head>
<body onload="parent.alertsize(document.body.scrollHeight);">
<div>
<xsl:apply-templates select="bookstore/book"/>
</div>
</body>
</html>
</xsl:template>
<xsl:template match="book[position() mod 2 = 1]">
<h4>
<xsl:value-of select='title' />
</h4>
<p>
<p>a mod 1</p>
<xsl:value-of select='price' />
</p>
</xsl:template>
<xsl:template match="book[position() mod 2 = 0]">
<h4>
<xsl:value-of select='title' />
</h4>
<p>
<p>a mod 0</p>
<xsl:value-of select='price' />
</p>
</xsl:template>
</xsl:stylesheet>
<强>结果强>
<html>
<head>
<META http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel="stylesheet" type="text/css" href="css/theStyle.css">
</head>
<body onload="parent.alertsize(document.body.scrollHeight);">
<div>
<h4>Harry Potter</h4>
<p>
<p>a mod 1</p>29.99</p>
<h4>Learning XML</h4>
<p>
<p>a mod 0</p>39.95</p>
<h4>A book</h4>
<p>
<p>a mod 1</p>39.95</p>
<h4>Another Book</h4>
<p>
<p>a mod 0</p>39.95</p>
</div>
</body>
</html>
<强>解释强>
您可以使用循环和xsl:if
来实现相同的结果,但模板功能更强大。您可以将它们视为仅应用于匹配参数的函数。它绝对有助于减少代码的缩进,并将奇数和偶数书籍的模板彼此分开。