2009-06-18 4 views
1

J'ai une application qui appelle un service Web (axe base) pour obtenir une réponse dans le format suivant:Java, XSLT: Comment gérer les espaces de noms dynamiques générés par l'axe dans XSLT

 
<?xml version="1.0"?> 
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soapenv:Body> 
     <axis2ns394:ServiceLevelDetailsResponse xmlns:axis2ns394="urn:myco:com:mapping:service:3.0"> 
      <ns1:errorFlag xmlns:ns1="urn:myco:com:mapping:service:3.0">false</ns1:errorFlag> 
      <axis2ns394:customerProgram> 
       <axis2ns394:name>ABC</axis2ns394:name> 
       <axis2ns394:description>ABC SERVICES</axis2ns394:description> 
       <axis2ns394:programRank>1</axis2ns394:programRank> 
       <axis2ns394:bindOptions> 
        <axis2ns394:name>PRO1A</axis2ns394:name> 
        <axis2ns394:description>Complete Home Solution</axis2ns394:description> 
        <axis2ns394:programName>PROMO</axis2ns394:programName> 
        <axis2ns394:programDescription>Promotional Bundle 1A</axis2ns394:programDescription> 
       </axis2ns394:bindOptions> 
       <axis2ns394:bindOptions> 
        <axis2ns394:name>PRO2A</axis2ns394:name> 
        <axis2ns394:description>Buy 1 Get 1 Free</axis2ns394:description> 
        <axis2ns394:programName>PROMO</axis2ns394:programName> 
        <axis2ns394:programDescription>Promotional Bundle 2A</axis2ns394:programDescription> 
       </axis2ns394:bindOptions> 
      </axis2ns394:customerProgram> 
     </axis2ns394:ServiceLevelDetailsResponse> 
    </soapenv:Body> 
</soapenv:Envelope> 


ici - la namespace 'axis2ns394' est généré dynamiquement au moment de l'exécution. J'ai besoin d'écrire un XSLT pour aplatir ce XML vers un XML plus simple (Dites une table html avec une ligne pour chaque 'customerProgram'). Mais je ne suis pas sûr de savoir comment gérer ces espaces de noms dynamiques.

Toute aide sera grandement appréciée.

Cordialement,
- Ashish

Répondre

4

l'espace de noms est- dynamique, ou l'espace de noms préfixe dynamique?

L'espace de noms réel pour le XML est

Ainsi, une feuille de style par exemple pour transformer les résultats n'a pas besoin de savoir ce que l'espace de noms préfixe est, mais ce que l' est Namespace. Vous pouvez utiliser un préfixe d'espace de nom différent dans votre XSLT et il correspondra aux éléments, à condition que vous déclariez correctement l'espace de noms .

Par exemple, ce stylesheet déclarant l'espace de noms préfixemyco pour l'espace de noms urn: myco: com: cartographie: Service: 3.0:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:myco="urn:myco:com:mapping:service:3.0" 
> 

<xsl:template match="/"> 
<table border="1"> 
<thead> 
<tr> 
<th>Name</th> 
<th>Description</th> 
<th>Program Rank</th> 
</tr> 
</thead> 
    <xsl:apply-templates select="//myco:customerProgram" /> 
</table> 
</xsl:template> 

<xsl:template match="myco:customerProgram"> 
<tr> 
    <td> 
    <xsl:value-of select="myco:name" /> 
    </td> 
<td> 
    <xsl:value-of select="myco:description" /> 
    </td> 
<td> 
    <xsl:value-of select="myco:programRank" /> 
    </td> 

</tr> 
</xsl:template> 
</xsl:stylesheet> 

produirait:

<table border="1"> 
<thead> 
<tr> 
<th>Name</th> 
<th>Description</th> 
<th>Program Rank</th> 
</tr> 
</thead> 
<tbody> 
<tr> 
<td>ABC</td> 
<td>ABC SERVICES</td> 
<td>1</td> 
</tr> 
</tbody> 
</table> 
+1

+1 - c'est une idée fausse commune sur ce que font réellement les attributs xmlns – kdgregory

+0

As vous avez correctement souligné. L'espace de noms 'préfixe' est dynamique. Merci pour la solution - son charme likea travaillé. – Vini