私は XSL にかなり慣れていないので、コードを最適化しようとしています。必要なことは、項目数が 3 つまたは 3 つ以上の場合、XSL の出力を変更することです。項目が 3 つある場合は、それぞれに1 つの 要素<div/>
のみを含める必要があります。<a/>
6 つある場合<div/>
は、2 つの<a/>
要素が含まれている必要があります。以下のコードは機能しますが、もっと良い方法があるはずです。
3品だとこんな感じ
<div>
<div>
<a href="/link1.html">
<div>
<h1>Header 1</h1>
<p>Body coy 1</p>
</div>
</a>
</div>
<div>
<a href="/link2.html">
<div>
<h1>Header 2</h1>
<p>Body coy 2</p>
</div>
</a>
</div>
<div>
<a href="/link3.html">
<div>
<h1>Header 3</h1>
<p>Body coy 3</p>
</div>
</a>
</div>
</div>
6 つの項目がある場合は、次のようになります。
<div>
<div>
<a href="/link1.html">
<div>
<h1>Header 1</h1>
<p>Body coy 1</p>
</div>
</a>
<a href="/link2.html">
<div>
<h1>Header 2</h1>
<p>Body coy 2</p>
</div>
</a>
</div>
<div>
<a href="/link3.html">
<div>
<h1>Header 3</h1>
<p>Body coy 3</p>
</div>
</a>
<a href="/link4.html">
<div>
<h1>Header 4</h1>
<p>Body coy 4</p>
</div>
</a>
</div>
<div>
<a href="/link5.html">
<div>
<h1>Header 5</h1>
<p>Body coy 5</p>
</div>
</a>
<a href="/link6.html">
<div>
<h1>Header 6</h1>
<p>Body coy 6</p>
</div>
</a>
</div>
</div>
XML (6 項目):
<?xml version="1.0" encoding="UTF-8"?>
<root>
<article>
<header>Header 1</header>
<body>Body coy 1</body>
<url><a href="/link1.html" title="Link1">Link 1</a></url>
</article>
<article>
<header>Header 2</header>
<body>Body coy 2</body>
<url><a href="/link2.html" title="Link2">Link 2</a></url>
</article>
<article>
<header>Header 3</header>
<body>Body coy 3</body>
<url><a href="/link3.html" title="Link1">Link 3</a></url>
</article>
<article>
<header>Header 4</header>
<body>Body coy 4</body>
<url><a href="/link4.html" title="Link4">Link 4</a></url>
</article>
<article>
<header>Header 5</header>
<body>Body coy 5</body>
<url><a href="/link5.html" title="Link1">Link 5</a></url>
</article>
<article>
<header>Header 6</header>
<body>Body coy 6</body>
<url><a href="/link6.html" title="Link1">Link 6</a></url>
</article>
</root>
XML (3 項目):
<?xml version="1.0" encoding="UTF-8"?>
<root>
<article>
<header>Header 1</header>
<body>Body coy 1</body>
<url><a href="/link1.html" title="Link1">Link 1</a></url>
</article>
<article>
<header>Header 2</header>
<body>Body coy 2</body>
<url><a href="/link2.html" title="Link2">Link 2</a></url>
</article>
<article>
<header>Header 3</header>
<body>Body coy 3</body>
<url><a href="/link3.html" title="Link1">Link 3</a></url>
</article>
</root>
XSL:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- the number of items to include in each group -->
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/root">
<div>
<xsl:variable name="articleCount" select="count(article)"/>
<xsl:variable name="group" select="$articleCount div 3" />
<xsl:choose>
<xsl:when test="$articleCount = 3">
<xsl:for-each select="article">
<div>
<xsl:call-template name="articleItem">
<xsl:with-param name="item" select="."/>
</xsl:call-template>
</div>
</xsl:for-each>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates
select="article[position() mod 2 = 1]" >
<xsl:with-param name="group" select="2"/>
</xsl:apply-templates>
</xsl:otherwise>
</xsl:choose>
</div>
</xsl:template>
<xsl:template match="article" mode="inner">
<xsl:param name="group"/>
<!-- handle items appropriately here -->
<xsl:call-template name="articleItem">
<xsl:with-param name="item" select="."/>
</xsl:call-template>
</xsl:template>
<xsl:template match="article">
<xsl:param name="group"/>
<div class="article">
<xsl:apply-templates
select=".|following-sibling::article[$group > position()]"
mode="inner" />
</div>
</xsl:template>
<xsl:template name="articleItem">
<xsl:param name="item"/>
<a>
<xsl:attribute name="href"><xsl:value-of select="url/a/@href" /></xsl:attribute>
<xsl:call-template name="articleContent">
<xsl:with-param name="item" select="."/>
</xsl:call-template>
</a>
</xsl:template>
<xsl:template name="articleContent">
<xsl:param name="item"/>
<div class="article-copy">
<h1><xsl:value-of disable-output-escaping="yes" select="header" /></h1>
<p><xsl:value-of disable-output-escaping="yes" select="body" /></p>
</div>
</xsl:template>
</xsl:stylesheet>