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>

この XML ファイルを XHTML で表示する XSL スタイルシートを 1 行に 2 冊だけ作成する必要があります。XML ファイル内の本の数はいつでも変更される可能性があるため、XSL はこれを考慮できる必要があります。これの1つの解決策は、データをテーブルに入れることだと思いましたが、これを作成する有効な方法を理解するのに十分な頭脳を働かせることはできません. 考えられるアイデアは、係数 2 のチェックを実行するか、書籍の総数を 2 で割ることでしたが、これをどのように記述して有効なコードを作成するかを結論付けることができませんでした。以下は、すべての本を 1 つの長い列に順番に表示するための私の最初の解決策です。

    <?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つのオプションかもしれないと思っただけです)

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 に答える