xslt记录显示
我遇到问题。我从xml获取数据,然后使用xslt进行转换。xslt记录显示
让我们说我有一个XML文件:
<?xml version="1.0"?>
<root>
<row id="1" fname="Dan" lname="Wahlin">
<address type="home">
<street>1234 Anywhere St.</street>
<city>AnyTown</city>
<zip>85789</zip>
</address>
<address type="business">
<street>1234 LottaWork Ave.</street>
<city>AnyTown</city>
<zip>85786</zip>
</address>
</row>
<row id="2" fname="Elaine" lname="Wahlin">
<address type="home">
<street>1234 Anywhere St.</street>
<city>AnyTown</city>
<zip>85789</zip>
</address>
<address type="business">
<street>1233 Books Way</street>
<city>AnyTown</city>
<zip>85784</zip>
</address>
</row>
</root>
而这个样式表:
<?xml version="1.0" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="xml" indent="yes" encoding="utf-8" omit-xml-declaration="no"/>
<xsl:template match="/">
<root>
<xsl:apply-templates/>
</root>
</xsl:template>
<xsl:template match="row">
<row>
<xsl:attribute name="id">
<xsl:value-of select="id"/>
</xsl:attribute>
<xsl:attribute name="fname">
<xsl:value-of select="name/fname"/>
</xsl:attribute>
<xsl:attribute name="lname">
<xsl:value-of select="name/lname"/>
</xsl:attribute>
<xsl:for-each select="address">
<xsl:copy-of select="."/>
</xsl:for-each> </row>
</xsl:template>
</xsl:stylesheet>
如何限制这3条记录,再经过3个记录它创建一个tr标签?
例如:
<table>
<tr>
<td>Address1</td>
<td>Address2</td>
<td>Address3</td>
</tr>
<tr>
<td>Address4</td>
<td>Address5</td>
<td>Address6</td>
</tr>
</table>
相反的:
<xsl:for-each select="address">
<xsl:copy-of select="."/>
</xsl:for-each>
你应该有这样的事情:
<xsl:for-each select="address">
<xsl:if test="position() mod 3 = 1">
<tr>
<xsl:call-template name="printAddress">
<xsl:with-param name="address" select="."/>
</xsl:call-template>
<xsl:call-template name="printAddress">
<xsl:with-param name="address" select="following-sibling::*[position() = 1]"/>
</xsl:call-template>
<xsl:call-template name="printAddress">
<xsl:with-param name="address" select="following-sibling::*[position() = 2]"/>
</xsl:call-template>
</tr>
</xsl:if>
</xsl:for-each>
当然,你得有模板printAddress地方。
这应该给你一个关于如何解决它的想法。重点是处理每个第n项(由position()mod n选择)并且一次显式处理n个以下项目(由follow-sibling :: * [position()= x]选择),并将它们包装在tr中。请注意,将mod结果与1进行比较很重要,因为位置从1开始计数。
什么是“galleryItem”?这是我的样式表中存在的吗? – user335160 2010-07-21 07:37:27
这只是从我自己的模板复制粘贴,它从一个简单列表创建3列图像列表,这与您的情况相同。正如我写的,它应该给你一个如何去做的想法,你应该能够将它应用于你自己的情况。 – 2010-07-21 12:48:41
仅仅为完全不同的输入发布样式表是相当混乱的。你至少可以做的就是使你的技术适应给定的输入数据。 – 2010-07-21 15:59:54
@crisgomez:对不起,但是您的输入与您所需的输出不匹配。另外,你的样式表正在做一个详细的标识转换。所以,这个问题并不清楚,而且你的低利率不利于猜测。 – 2010-07-21 13:25:31