XSLT запись отображения - PullRequest
1 голос
/ 21 июля 2010

У меня проблема.Я получаю данные из 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 голосов
/ 21 июля 2010

Вместо:

<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. Обратите внимание, что важно сравнить результат мода с 1, так как позиция начинает считать с 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...