xslt记录显示

时间:2010-07-21 07:11:08

标签: xslt

我有问题。我从xml获取数据,然后用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>

1 个答案:

答案 0 :(得分:0)

而不是:

<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开始计数。