我有一個樣式表,我正在使用一個只適用於XSLT 1.0的perl模塊。我想在JSON字典內創建一個JSON數組,所以我需要適當的逗號分隔元素。我正在解析第二個單元格中有一個或多個跨度的XHTML表。所以for-each select =「./ tr」,然後是for-each select =「./ td [1]/span」或類似的東西。嵌套的位置()和末尾()嵌套 - 每個xslt
改變了一點後,它的行爲如伊恩所說的那樣。
<?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範圍?
這就是'position()'和'last()'應該如何在內部循環中工作 - 究竟是什麼不能如你所期望的那樣工作? –
逗號被添加,就好像它正在檢查外部循環元素的位置。我的問題描述得不好嗎?感謝您看看它。 –
如果沒有看到實際的XSLT代碼,很難判斷髮生了什麼。如果你真的直接在內部的'for-each'中使用'position()'和'last()'函數(而不是在某個地方的'[]'謂詞中),那麼它應該像你期望的那樣工作... –