2016-07-15 8 views
0

Meine Quelle XML ist:XSLT Erstellen Namespace dynamisch

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<ns2:DriverResponse xmlns:ns2="com/rsa/eosago/schema-1.1" xmlns:ns3="com/rsa/dkbm/schema-1.5"> 
    <IDCheckDriver>84714718</IDCheckDriver> 
    <ErrorList> 
    <ErrorInfo> 
     <Code>2</Code> 
     <Message>Принят в обработку</Message> 
    </ErrorInfo> 
    </ErrorList> 
</ns2:DriverResponse> 

gewünschte Ausgabe:

<?xml version="1.0" encoding="UTF-8"?> 
<rsa:DriverStatusRequest xmlns:rsa="com/rsa/eosago/schema-1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <InsurerID>18800000</InsurerID> 
    <IDCheckDriver>84714718</IDCheckDriver> 
</rsa:DriverStatusRequest> 

Ich erwarte, dass diese Ausgabe dieses XSL wich unter Verwendung von Apache Camel genannt:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ext="http://exslt.org/common" exclude-result-prefixes="ext"> 
<xsl:param name="RSA-InsurerID"/> 
<xsl:param name="EOSAGO-schema-version"/> 

<xsl:param name="schema" select="concat('com/rsa/eosago/schema-', $EOSAGO-schema-version)"/> 
<xsl:variable name="schemaUrlDummy"> 
    <xsl:element name="ns2:dummy" namespace="{$schema}"/> 
</xsl:variable> 
<xsl:variable name="NS" select="ext:node-set($schemaUrlDummy)/*/namespace::ns2"/> 

<xsl:template match="/"> 
    <xsl:element name="rsa:DriverStatusRequest" namespace="com/rsa/eosago/schema-{$EOSAGO-schema-version}">    

     <InsurerID> 
      <xsl:value-of select="$RSA-InsurerID"/> 
     </InsurerID> 

     <xsl:element name="IDCheckDriver"> 
      <xsl:copy-of select="namespace::*[not(name()='ns2')]"/> 
      <xsl:copy-of select="$NS"/> 
      <xsl:value-of select="ns2:DriverResponse/IDCheckDriver"/> 
     </xsl:element> 

    </xsl:element> 
    </xsl:template> 
</xsl:stylesheet> 

Kameleinstellungen:

<setHeader headerName="RSA-InsurerID"> 
    <constant>18800000</constant> 
</setHeader> 

<setHeader headerName="EOSAGO-schema-version"> 
    <constant>1.2</constant> 
</setHeader> 

<to uri="xslt:com/rsa/eosago/xsl/DriverResponse2DriverStatusRequest.xsl"/> 

Das Problem ist, dass ich diesen Fehler stacktrace

Endpunkt lösen konnte nicht erhalten: xslt: //com/rsa/eosago/xsl/DriverResponse2DriverStatusRequest.xsl durch: Namespacepräfix ‚ns2‘ nicht deklarierte ist.

Fehler beim Auflösen des Endpunkts: xslt: //com/rsa/eosago/xsl/DriverResponse2DriverStatusRequest.xsl aufgrund: Namespace-Präfix 'ns2' ist nicht deklariert.

javax.xml.transform.TransformerConfigurationException: Namespace-Präfix 'ns2' ist nicht deklariert.

Warum löst der Compiler eine Ausnahme für Namespaces, die dynamisch erstellt wurden?

Antwort

0

Dies ist sehr verwirrend. Warum kann das nicht tun Sie einfach:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:param name="RSA-InsurerID"/> 
<xsl:param name="EOSAGO-schema-version"/> 

<xsl:template match="/*"> 
    <xsl:element name="rsa:DriverStatusRequest" namespace="com/rsa/eosago/schema-{$EOSAGO-schema-version}">    
     <InsurerID> 
      <xsl:value-of select="$RSA-InsurerID"/> 
     </InsurerID> 
     <IDCheckDriver> 
      <xsl:value-of select="IDCheckDriver"/> 
     </IDCheckDriver> 
    </xsl:element> 
</xsl:template> 

</xsl:stylesheet> 

Arbeits Demo: http://xsltransform.net/pPzifqv

+0

Mann, wirklich danke! Werde heute Abend etwas Wodka für dich haben!)))) – bearbeard