1

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

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

4

1 回答 1

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

于 2012-11-28T00:35:16.927 回答