2016-07-15 27 views
0

マイソースXMLは次のとおりです。XSLTを動的に

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

募集出力:

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

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

私はこのXSLのウィッヒを使用して、この出力は、Apacheキャメルから呼び出される期待しますキャメル設定:

<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"/> 

問題は、私は、このエラーのスタックトレース

は、エンドポイントの解決に失敗しました得ることです:XSLT://com/rsa/eosago/xsl/DriverResponse2DriverStatusRequest.xslによる:名前空間接頭辞「NS2」は宣言されていないです。

エンドポイントの解決に失敗しました:xslt://com/rsa/eosago/xsl/DriverResponse2DriverStatusRequest.xsl:名前空間接頭辞 'ns2'は宣言されていません。

javax.xml.transform.TransformerConfigurationException:名前空間接頭辞 'ns2'は宣言されていません。

なぜコンパイラはディナム的に作成された名前空間で例外をスローしますか?

答えて

0

これは非常に混乱しています。なぜあなたは、単に行うことはできません。

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

の作業のデモ:http://xsltransform.net/pPzifqv

+0

マン、本当にありがとう!今夜あなたのためにいくつかのウォッカがあります!)))))))) – bearbeard

関連する問題