2010-11-22 3 views
1

J'utilise XSLT et XML.Comment afficher le même type de données à partir de XML en utilisant XSLT

J'ai ci-dessous XML.

<documentCountryInformation> 
     <countryCode>US</countryCode> 
     <countryName>United States</countryName> 
     <sufficientDocumentation>Conditional</sufficientDocumentation> 
     <sectionInformation> 
      <sectionName>Health</sectionName> 
      <documentParagraph paragraphId="23628"> 
      <paragraphType>Requirement</paragraphType> 
      <paragraphText> 
       <p> 
       Vaccination for 
       <strong>yellow fever</strong> 
       Persons without valid yellow fever certification, if required, are subject to quarantine for a period up to 6 days. 
       </p> 
      </paragraphText> 
      </documentParagraph>    
     </sectionInformation> 
</documentCountryInformation> 
<documentCountryInformation> 
     <countryCode>IN</countryCode> 
     <countryName>India</countryName> 
     <sufficientDocumentation>Conditional</sufficientDocumentation> 
     <sectionInformation> 
      <sectionName>Health</sectionName> 
      <documentParagraph paragraphId="23648"> 
      <paragraphType>Requirement</paragraphType> 
      <paragraphText> 
       <p> 
       Vaccination for 
       <strong>Dengue fever</strong> 
       Persons without valid yellow fever certification, if required, are subject to quarantine for a period up to 3 days. 
       </p> 
      </paragraphText> 
      </documentParagraph>    
     </sectionInformation> 
</documentCountryInformation> 

Au-dessus est la partie xml complète et vous pouvez voir il y a deux dossiers de même type, maintenant j'ai le <countryName> dans les paramètres de XSLT dans l'exemple ci-dessus mon paramètre countryName contiendra ce type de données "Etats-Unis, Inde", Maintenant, je veux diviser les données de paramètres et en outre il va vérifier le XML ayant le même nom de pays et afficher les données selon, je veux dire il y aura boucle sur nom du pays et ci-dessous est HTML désiré.

<div class="resultsContainer" id="divTransit"> 
     <h3>Transit - United States (US)</h3>        
     <p> 
     Vaccination for 
     <strong>yellow fever</strong> 
     Persons without valid yellow fever certification, if required, are subject to quarantine for a period up to 6 days. 
     </p> 

     <h3>Transit - India (IN)</h3>        
     <p> 
     Vaccination for 
     <strong>Dengue fever</strong> 
     Persons without valid yellow fever certification, if required, are subject to quarantine for a period up to 3 days. 
     </p> 
</div> 
+0

Je ne comprends pas le problème. Cette sortie semble très simple à faire avec une correspondance de modèle XSLT, pourquoi avez-vous besoin d'une "boucle"? –

+0

c'était ma pensée oui vous avez raison nous pouvons utiliser le modèle de correspondance, je pensais que nous pourrions avoir besoin que j'ai divisé les valeurs de paramètres aussi. S'il vous plaît suggérer –

+0

Bonne question, +1. Voir ma réponse pour une solution complète et courte. :) –

Répondre

1

Maintenant, je veux diviser les données de paramètres et de plus il vérifiera le XML ayant même nom de pays et d'affichage les données en fonction, je veux dire qu'il y aura boucle être sur le nom du pays et au-dessous est HTML désiré.

Il n'y a pas besoin de « diviser » la valeur du paramètre, ni pour une « boucle » de toute sorte.

Cette transformation:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:param name="pCountryName" select="'United States,India'"/> 

<xsl:template match="/*"> 
    <div class="resultsContainer" id="divTransit"> 
    <xsl:apply-templates select= 
     "*[contains(concat(',',$pCountryName,','), 
        concat(',',countryName,',') 
       ) 
     ] 
     "/> 
    </div> 
</xsl:template> 

<xsl:template match="documentCountryInformation"> 
    <h3> 
    <xsl:value-of select= 
    "concat('Transit - ', 
      countryName, 
      ' (', 
      countryCode, 
      ')' 
      ) 
    "/> 
    </h3> 
    <xsl:copy-of select="*/*/paragraphText/node()"/> 
</xsl:template> 
</xsl:stylesheet> 

lorsqu'il est appliqué sur le document XML fourni (enveloppé dans un élément supérieur pour devenir wellformed):

<t> 
    <documentCountryInformation> 
     <countryCode>US</countryCode> 
     <countryName>United States</countryName> 
     <sufficientDocumentation>Conditional</sufficientDocumentation> 
     <sectionInformation> 
      <sectionName>Health</sectionName> 
      <documentParagraph paragraphId="23628"> 
       <paragraphType>Requirement</paragraphType> 
       <paragraphText> 
        <p> 
       Vaccination for 
         <strong>yellow fever</strong> 
       Persons without valid yellow fever certification, if required, are subject to quarantine for a period up to 6 days. 
        </p> 
       </paragraphText> 
      </documentParagraph> 
     </sectionInformation> 
    </documentCountryInformation> 
    <documentCountryInformation> 
     <countryCode>IN</countryCode> 
     <countryName>India</countryName> 
     <sufficientDocumentation>Conditional</sufficientDocumentation> 
     <sectionInformation> 
      <sectionName>Health</sectionName> 
      <documentParagraph paragraphId="23648"> 
       <paragraphType>Requirement</paragraphType> 
       <paragraphText> 
        <p> 
       Vaccination for 
         <strong>Dengue fever</strong> 
       Persons without valid yellow fever certification, if required, are subject to quarantine for a period up to 3 days. 
        </p> 
       </paragraphText> 
      </documentParagraph> 
     </sectionInformation> 
    </documentCountryInformation> 
</t> 

produit le résultat souhaité, correct:

<div class="resultsContainer" id="divTransit"> 
    <h3>Transit - United States (US)</h3> 

    <p> 
       Vaccination for 
         <strong>yellow fever</strong> 
       Persons without valid yellow fever certification, if required, are subject to quarantine for a period up to 6 days. 
        </p> 

    <h3>Transit - India (IN)</h3> 

    <p> 
       Vaccination for 
         <strong>Dengue fever</strong> 
       Persons without valid yellow fever certification, if required, are subject to quarantine for a period up to 3 days. 
        </p> 

</div> 
0

Vous pouvez avoir un modèle

<xsl:template match="documentCountryInformation[contains($countryName, countryName)]"> 
+0

Notez que cela suppose qu'aucun nom de pays ne peut contenir un autre nom de pays. Si vous voulez une correspondance plus robuste, vous pouvez ajouter des délimiteurs, comme le montre la réponse de @ Dimitre. – LarsH

Questions connexes