使用XSL从XML创建XHTML - 具有预定义宽度的表

时间:2012-11-27 23:50:46

标签: xml xslt xhtml

想象一下下面的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>

任何提示/指针/解决方案都非常感谢。 (不一定需要表作为解决方案,我只是认为这可能是一个选项)

1 个答案:

答案 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来实现相同的结果,但模板功能更强大。您可以将它们视为仅应用于匹配参数的函数。它绝对有助于减少代码的缩进,并将奇数和偶数书籍的模板彼此分开。