Có một lỗi trong đầu ra đề nghị, như <img/>
yếu tố phải có alt
thuộc tính trong mỗi phiên bản của HTML, trong đó họ có mặt.
Dù sao sau đây thực hiện điều này nhưng không có các thuộc tính có thể được thực hiện từ CSS thay thế (chỉ để giữ kích thước xuống). Thêm chúng trở lại trong nếu muốn là tầm thường:
<xsl:template match="pics">
<table>
<xsl:apply-templates select="pic[position() mod 3 = 1]"/>
</table>
</xsl:template>
<xsl:template match="pic[position() mod 3 = 1]">
<tr>
<td>
<xsl:if test="2 > count(following-sibling::pic)">
<xsl:attribute name="colspan">
<xsl:value-of select="3 - count(following-sibling::pic)"/>
</xsl:attribute>
</xsl:if>
<img src="{.}" alt="" />
</td>
<xsl:apply-templates select="following-sibling::pic[3 > position()]" />
</tr>
</xsl:template>
<xsl:template match="pic">
<td><img src="{.}" alt=""/></td>
</xsl:template>
Trên đây giả sử bạn muốn con đường từ các tập tin sử dụng trực tiếp, thêm mã để biến nó một cách nào đó (nói chỉ mất phần cuối cùng của con đường sử dụng substring-after()
) không phải là một phần mở rộng khó khăn, giả sử rằng sự biến đổi không phức tạp.
Chỉnh sửa:
Bản thân tôi và JohnB sẽ đi sâu vào lãnh thổ ở đây, ở trên đủ để trả lời câu hỏi gốc.
Đã thêm để trả lời đầy đủ hơn cho câu hỏi của JohnB. Sau đây là mã tương đương sử dụng cho mỗi thay vì áp dụng các mẫu. Về mặt lý thuyết, việc xử lý cơ sở của một bộ xử lý XSLT tuần tự và xử lý phải giống nhau, mặc dù bạn có thể thấy sự khác biệt trong thực tế (nếu bạn nói với tôi rằng chúng khác với một bộ xử lý đã cho) nhanh hơn một chút với việc xử lý tuần tự và hơi chậm hơn với xử lý trạng thái máy, nhưng tôi chỉ đặt cược một lượng rất nhỏ).
Lưu ý rằng chúng tôi không thể sử dụng lại mẫu mặc định cho pic. Mặt khác, nếu chúng ta có một mẫu mặc định khác cho pic ở nơi khác (nếu đây là một phần của một bản định kiểu phức tạp hơn), chúng ta không cần phải phân biệt giữa chúng, đó là thời gian chính mà cá nhân tôi sẽ nghiêng về phía mỗi người.
<xsl:template match="pics">
<table>
<xsl:for-each select="pic[position() mod 3 = 1]">
<tr>
<td>
<xsl:if test="2 > count(following-sibling::pic)">
<xsl:attribute name="colspan">
<xsl:value-of select="3 - count(following-sibling::pic)"/>
</xsl:attribute>
</xsl:if>
<img src="{.}" alt="" />
</td>
<xsl:for-each select="following-sibling::pic[3 > position()]">
<td><img src="{.}" alt=""/></td>
</xsl:for-each>
</tr>
</xsl:for-each>
</table>
</xsl:template>
Nguồn
2010-08-08 15:26:04
Câu hỏi hay (+1). Xem câu trả lời của tôi cho một giải pháp hoàn chỉnh có trong tinh thần của XSLT và để giải thích về tất cả những khoảnh khắc quan trọng trong giải pháp. :) –