XSLT1.0でのみ動作するperlモジュールで使用しているスタイルシートがあります。JSONディクショナリ内にJSON配列を作成したいので、要素に適切なコンマ区切りが必要です。2番目のセルに1つ以上のスパンがあるXHTMLテーブルを解析しています。つまり、for-each select = "./ tr"、次にfor-each select = "./ td [1]/span"などです。
少し変更すると、Ianが言ったように動作します。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" version="1.0" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" doctype-public="-//W3C//DTD HTML 4.01//EN" encoding="UTF-8" />
<xsl:template match="text()">
</xsl:template>
<xsl:template match="table/tbody">
<xsl:text>[</xsl:text>
<xsl:for-each select="./tr[not(@class='no-results')]">
<xsl:text>{"</xsl:text>
<xsl:value-of select="normalize-space(.//strong)" />
<xsl:text>":{"ingredients":{</xsl:text>
<xsl:for-each select=".//div[@class='reagent-list']//a[@class='item-link reagent']">
<xsl:value-of select="substring(./@href, 14)" />:<xsl:value-of select="normalize-space(./span[1])" />
<xsl:if test="position() != last()">
<xsl:text>,</xsl:text>
</xsl:if>
</xsl:for-each>
<xsl:text>}</xsl:text>
<xsl:if test="position() != last()">
<xsl:text>,</xsl:text>
</xsl:if>
<xsl:text> </xsl:text>
</xsl:for-each>
<xsl:text>]</xsl:text>
</xsl:template>
</xsl:stylesheet>
スタイルシートが以下のxmlと一致しないことに気付きました。実際のドキュメントは巨大です。しかし、私が何を意味するのか理解していただければ幸いです。私はこれを作りました:
<table>
<thead>
<tr>
<th>a</th>
<th>b</th>
<th>c</th>
</tr>
</thead>
<tbody>
<tr>
<td>foo</td>
<td><span>an element</span></td>
<td>bar</td>
</tr>
<tr>
<td>foo</td>
<td><span>an element</span><span>an element</span></td>
<td>bar</td>
</tr>
<tr>
<td>foo</td>
<td><span>an element</span><span>an element</span><span>an element</span><span>an element</span></td>
<td>bar</td>
</tr>
</tbody>
</table>
=>
{
"Row one":["an element"],
"Row two":["an element", "an element"],
"Row three":["an element", "an element", "an element", "an element"]
}
代わりに私はこれを取得します:
{
"Row one":["an element",],
"Row two":["an element", "an element",],
"Row three":["an element" "an element" "an element" "an element"]
}
position()
テストタグでコンマを印刷するために使用してきましたがlast()
、外側のループでは正しく機能しているようですが、配列を区切るコンマを印刷するときに、内側のfor-eachスコープを使用するようにテストタグに指示するにはどうすればよいですか?