2009-06-18 6 views
1

Ich habe eine Anwendung, die einen Webdienst (Achse basiert) ruft eine Antwort in folgendem Format zu erhalten:Java, XSLT: Wie die dynamischen Namespaces von Axis in XSLT erzeugt zu handhaben

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


hier - die Der Namespace 'axis2ns394' wird dynamisch zur Laufzeit generiert. Ich muss ein XSLT schreiben, um dieses XML zu einem einfacheren XML zu glätten (Sagen Sie eine html Tabelle mit einer Reihe für jedes 'customerProgram'). Aber ich bin mir nicht sicher, wie ich mit diesen dynamischen Namespaces umgehen soll.

Jede Hilfe wird sehr geschätzt.

Grüße,
- Ashish

Antwort

4

Ist Namespace dynamisch oder der Namespace Präfix dynamisch?

Der eigentliche Namespace für das XML ist

ein Beispiel Sheet also nicht um die Ergebnisse zu verwandeln nicht wissen müssen, was der Namespace Präfix ist, aber was die Namespace ist. Sie können ein anderes Namespace-Präfix in Ihrem XSLT verwenden und es wird für die Elemente übereinstimmen, solange Sie den Namespace korrekt deklarieren.

Zum Beispiel dieses Sheet erklärt den Namensraum Präfixmyco für den Namespaceurn: myco: com: Abbildung: 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> 

produzieren würde:

<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 - es ist weit verbreitetes Missverständnis darüber, was die xmlns-Attribute tatsächlich tun – kdgregory

+0

As Du hast richtig darauf hingewiesen. Der Namespace 'Präfix' ist dynamisch. Danke für die Lösung - es wirkte wie ein Charme. – Vini