2010-07-21 6 views
1

J'ai un problème. Je reçois les données de xml puis les transforme avec xslt.Affichage de l'enregistrement xslt

Disons que j'ai un fichier 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> 

Et cette feuille de style:

<?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> 

Comment limiter à 3 enregistrements, puis après 3 enregistrements il créer une balise tr?

Par exemple:

<table> 
<tr> 
    <td>Address1</td> 
    <td>Address2</td> 
    <td>Address3</td> 
</tr> 
<tr> 
    <td>Address4</td> 
    <td>Address5</td> 
    <td>Address6</td> 
</tr> 
</table> 
+0

@crisgomez: Désolé, mais votre saisie ne correspond pas à la sortie désirée. En outre, votre feuille de style effectue une transformation d'identité verbeuse. Donc, la question n'est pas claire et vous avez un faible taux qui décourage les devinettes. –

Répondre

0

Au lieu de:

<xsl:for-each select="address"> 
<xsl:copy-of select="."/> 
</xsl:for-each> 

Vous devriez avoir quelque chose comme ceci:

<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> 

Et bien sûr, vous devez avoir quelque part printAddress de modèle.

Cela devrait vous donner une idée sur la façon de le résoudre. Le but est de traiter chaque nième élément (choisi par mod() mod n) et de traiter explicitement n éléments suivants à la fois (choisi par following-sibling :: * [position() = x]), en les enveloppant dans tr. Notez qu'il est important de comparer le résultat du mod à 1, puisque la position commence à compter à partir de 1.

+0

qu'est ce que "galleryItem"? Est-ce que ce souhld existe dans ma feuille de style? – user335160

+0

Ceci est juste un copier-coller de mon propre modèle qui crée 3 colonnes tableau d'images à partir d'une liste simple, ce qui est la même situation que vous avez. Comme je l'ai écrit, il devrait juste vous donner une idée de la façon de le faire, vous devriez être capable de l'appliquer à votre situation vous-même. –

+0

Il est assez déroutant de poster une feuille de style pour une entrée totalement différente. Le moins que vous pourriez faire serait d'adapter votre technique pour les données d'entrée données. –