XSL XML-looping

Ik heb een XML-bestand dat ik gebruik XSL om te zetten in een html-pagina. Ik wil graag het XML-bestand doorlopen dat veel bovenliggende knooppunten bevat en vervolgens de onderliggende knooppunten doorlopen en het resultaat weergeven in een HTML-tabel.

Tot nu toe kan ik het knooppunt Ouder doorlopen en met succes terugsturen, maar wanneer ik hier een for-each -lus nest om de attibutes van het onderliggende knooppunt te retourneren, retourneer ik de kenmerken van alle onderliggende knooppunten in het document en niet die van het bovenliggende knooppunt.

Kan iemand hier een beetje licht op werpen?

XML:


    
        
    
    
        
    
    
        
    

XSL:

  <table border="1" cellspacing="2" width="800" bgcolor="white">
 
       <tr bgcolor="9acd32">
       <table><th>Admin Report Num:</th></table>
       <table><th>   </th></table>
    </tr>
    <tr>    
      
      <table><th>Data Report ID:</th></table>
              <table><th></th></table>
     
     </tr>
    
</table>
0
Dat is een rare naamruimte. De XML-regels voor naamruimten zijn behoorlijk wollig. Sommige gereedschappen/parsers laten je waarschijnlijk ermee wegkomen, maar vroeg of laat zul je er een vinden die dat niet doet.
toegevoegd de auteur Michael Kay, de bron
Waarom is <table> <th> **** </th> </table> zo vaak geschreven?
toegevoegd de auteur Siva Charan, de bron

4 antwoord

Dit kan netter worden gedaan met behulp van sjablonen in plaats van for-each :


    
    
        <table border="1" cellspacing="2" width="800" bgcolor="white">
            
        </table>
    
    
        <tr bgcolor="9acd32">
            <table><th>Admin Report Num:</th></table>
            <table><th></th></table>
        </tr>
        <tr></tr>
    
    
        <table><th>Data Report ID:</th></table>
        <table><th></th></table>
    

Notes:

  • Each section gets its own template, which more clearly structures the stylesheet
  • It will be easier to handle new elements in the future using this approach
  • I registered your namespace to the prefix x so that I could reference elements like x:DataSourceInformation instead of *[name()='DataSourceInformation']
  • for-each is rarely needed in XSLT; templates are almost always the more natural solution
  • If you insist on for-each, then look at @GSerg's answer
2
toegevoegd
+1 voor een beter antwoord.
toegevoegd de auteur Dimitre Novatchev, de bron
Mooie samenvatting @lwburk. We liepen beiden hetzelfde pad in.
toegevoegd de auteur Visual Stuart, de bron

Je bent dit overdreven aan het bekritiseren.

select is relative to the current context node:

<table border="1" cellspacing="2" width="800" bgcolor="white">
    
       <tr bgcolor="9acd32">
       <table><th>Admin Report Num:</th></table>
       <table><th>   </th></table>
       </tr>
       <tr> 
           
           <table><th>Data Report ID:</th></table>
           <table><th></th></table>
       
       </tr>
     
</table>
1
toegevoegd
@MichaelKay Ja. Maar zoals ik het begreep, heeft het document veel AdminReports met een unieke xmlns elk ( xmlns is een enigszins vreemde plaats voor datetime). Dat zou de inspanningen rechtvaardigen die het OP in zijn XSL laat zien.
toegevoegd de auteur GSerg, de bron
En natuurlijk kan /*/* [name() = 'AdminReport'] vereenvoudigd worden tot /*/n: AdminReport waar prefix n gebonden is aan de relevante namespace.
toegevoegd de auteur Michael Kay, de bron
Bedankt. Dat liet precies zien wat ik nodig had.
toegevoegd de auteur NewUser101, de bron

Het is gemakkelijker om XSLT te beschouwen als de declarative template matching engine die het is. Bekijk de xsl: template en xsl: apply-template elementen in dit voorbeeld. Beste wensen!

<?xml version="1.0" encoding="utf-8"?>

  

  
    <table border="1" cellspacing="2" width="800" bgcolor="white">
      
    </table>
  

  
      <tr bgcolor="9acd32">
        <th>Admin Report Num:</th>
        <th>
          
        </th>
      </tr>
      <tr>
        
      </tr>
  

  
      <table>
        <th>Data Report ID:</th>
      </table>
      <table>
        <th>
          
        </th>
      </table>
  


1
toegevoegd

There is no space between value-of & select


It should be

0
toegevoegd