2017-01-14 2 views
0

Iam пытается сделать преобразование xslt с помощью раздела cdata в нем. Мне нужно поместить преобразованный xml в тег aXMLInput как cdata section.iam, способный успешно создать xml. Можете ли вы сказать мне как создать контент в aXMLInput как раздел cdata. Отложенный вход xml, ожидаемый результат, xslt и фактический вывод. Спасибо, Adavance.XSLT Transformation для создания xml с секцией cdata

Входной XML:

<?xml version="1.0" encoding="UTF-8"?> 
    <ns2:esbMessage xmlns:ns2="http://messagev2.esb.company.com/"> 
     <header> 
      <identity> 
       <master-id/> 
       <source-id/> 
       <user-id>calleruname</user-id> 
      </identity> 
      <esb-service-name>Pricing</esb-service-name> 
      <source-system-id>caller</source-system-id> 
      <message-type>REQ</message-type> 
      <message-id>ID-GCSW01987-49931-1484306332450-6-131</message-id> 
     </header> 
     <body> 
      <request> 
       <esb-metadata> 
        <user-id>calleruname</user-id> 
        <service-name>Pricing</service-name> 
        <source-system-id>caller</source-system-id> 
       </esb-metadata> 
       <message-body> 
        <rating-request xmlns:urn1="urn:company:esb:services:Rating:v01"> 
         <fo> 
          <policy> 
           <provider-input> 
            <account-complexity code="med" description="Medium" source-system=" CUBE"/> 
            <primary-sic-code>2052-cook and crackers</primary-sic-code> 
            <policy-inception-date>2016-12-23</policy-inception-date> 
            <policy-expiration-date>2017-12-23</policy-expiration-date> 
            <requested-deductible> 
             <amount>1000.00</amount> 
             <currency>USD</currency> 
            </requested-deductible> 
            <requested-deductible> 
             <amount>1000.00</amount> 
             <currency>USD</currency> 
            </requested-deductible> 
           </provider-input> 
          </policy> 
         </fo> 
        </rating-request> 
       </message-body> 
      </request> 
     </body> 
    </ns2:esbMessage> 

Ожидаемый результат:

<ns2:esbMessage xmlns:ns2="http://messagev2.esb.company.com/"> 
    <header> 
     <identity> 
      <master-id/> 
      <source-id/> 
      <user-id>calleruname</user-id> 
     </identity> 
     <esb-service-name>Pricing</esb-service-name> 
     <source-system-id>caller</source-system-id> 
     <message-type>REQ</message-type> 
     <message-id>ID-GCSW01987-49931-1484306332450-6-131</message-id> 
    </header> 
    <body> 
     <rate:companyrating xmlns:rate="http://rateservices.provider.com/"> 
      <aAddRoot>1</aAddRoot> 
      <aAddInputs>0</aAddInputs> 
      <aXMLInput><![CDATA[<rate lob="15"> 
        <c i="0" desc="Policy"> 
         <m i="2" n="PolicyInceptionDate" v="2016-12-23"/> 
         <m i="3" n="PolicyExpiryDate" v="2017-12-23"/> 
         <c i="1" desc="PropertyLine"> 
          <m i="54" n="SICCode" v="2052-cook and crackers"/> 
          <m i="74" n="AccountSize" v="med"/> 
         </c> 
        </c> 
       </rate>]]></aXMLInput> 
     </rate:companyrating> 
    </body> 
</ns2:esbMessage> 

XSLT:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" xpath-default-namespace="yes"> </xsl:output> 
    <xsl:template match="/"> 
     <xsl:apply-templates select="*"/> 
    </xsl:template> 
    <xsl:template match="body/request"> 
     <rate:companyrating xmlns:rate="http://rateservices.provider.com/"> 
      <aAddRoot>1</aAddRoot> 
      <aAddInputs>0</aAddInputs> 
      <xsl:apply-templates select="*"/> 
     </rate:companyrating> 
    </xsl:template> 
    <xsl:template match="body/request/esb-metadata"> 
    </xsl:template> 
    <xsl:template match="body/request/message-body"> 
     <aXMLInput> 
      <rate lob="15"> 
       <c i="0" desc="Policy"> 
        <xsl:call-template name="policy-inception-date"/> 
        <xsl:call-template name="policy-expiration-date"/> 
        <xsl:call-template name="primary-sic-code"/> 

       </c> 
      </rate> 
     </aXMLInput> 
    </xsl:template> 
    <xsl:template name="policy-inception-date"> 
     <m> 
      <xsl:attribute name="i"><xsl:value-of select="2"/></xsl:attribute> 
      <xsl:attribute name="n"><xsl:value-of select="'PolicyInceptionDate'"/></xsl:attribute> 
      <xsl:attribute name="v"><xsl:value-of select='rating-request/fo/policy/provider-input/policy-inception-date'/></xsl:attribute> 
     </m> 
    </xsl:template> 
    <xsl:template name="policy-expiration-date"> 
     <m> 
      <xsl:attribute name="i"><xsl:value-of select="3"/></xsl:attribute> 
      <xsl:attribute name="n"><xsl:value-of select="'PolicyExpiryDate'"/></xsl:attribute> 
      <xsl:attribute name="v"><xsl:value-of select='rating-request/fo/policy/provider-input/policy-expiration-date'/></xsl:attribute> 
     </m> 
    </xsl:template> 
    <xsl:template name="primary-sic-code"> 
     <c i="1" desc="PropertyLine"> 
      <m> 
       <xsl:attribute name="i"><xsl:value-of select="54"/></xsl:attribute> 
       <xsl:attribute name="n"><xsl:value-of select="'SICCode'"/></xsl:attribute> 
       <xsl:attribute name="v"><xsl:value-of select='rating-request/fo/policy/provider-input/primary-sic-code'/></xsl:attribute> 
      </m> 
      <m i="74" n="AccountSize" v="med"/> 
     </c> 
    </xsl:template> 
    <xsl:template match="* | @*"> 
     <xsl:copy> 
      <xsl:copy-of select="@*"/> 
      <xsl:apply-templates/> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

Фактический выход:

<?xml version="1.0" encoding="UTF-8"?> 
<ns2:esbMessage xmlns:ns2="http://messagev2.esb.company.com/"> 
    <header> 
     <identity> 
      <master-id/> 
      <source-id/> 
      <user-id>calleruname</user-id> 
     </identity> 
     <esb-service-name>Pricing</esb-service-name> 
     <source-system-id>caller</source-system-id> 
     <message-type>REQ</message-type> 
     <message-id>ID-GCSW01987-49931-1484306332450-6-131</message-id> 
    </header> 
    <body> 
     <rate:companyrating xmlns:rate="http://rateservices.provider.com/"> 
      <aAddRoot>1</aAddRoot> 
      <aAddInputs>0</aAddInputs> 
      <aXMLInput> 
       <rate lob="15"> 
        <c i="0" desc="Policy"> 
         <m i="2" n="PolicyInceptionDate" v="2016-12-23"/> 
         <m i="3" n="PolicyExpiryDate" v="2017-12-23"/> 
         <c i="1" desc="PropertyLine"> 
          <m i="54" n="SICCode" v="2052-cook and crackers"/> 
          <m i="74" n="AccountSize" v="med"/> 
         </c> 
        </c> 
       </rate> 
      </aXMLInput> 
     </rate:companyrating> 
    </body> 
</ns2:esbMessage> 
+0

Код говорит 'version =" 2.0 "', но вы отметили этот вопрос как XSLT 1.0. Итак, какой XSLT-процессор вы используете, предоставляет ли он функцию расширения или поддержку функции «serialize» XPath 3.0 (например, например, Saxon 9.6)? –

+0

Привет, Martin iam, используя версию 2.0, спасибо, что сообщили мне, что я удалил тег xslt 1.0, я буду называть xslt в верблюде apache, поэтому я не думал использовать любую функцию расширения из коробки. – Ravi

+0

Возможный дубликат [Добавить CDATA в xml-файл] (http://stackoverflow.com/questions/15534255/add-cdata-to-an-xml-file) – Joe

ответ

0

Если вы используете версию Saxon, как 9,6 или 9,7, поддерживающей XPath 3.0 serialize функции (https://www.w3.org/TR/xpath-functions-30/#func-serialize), то вы можете изменить шаблон

<xsl:template match="body/request/message-body"> 
    <aXMLInput> 
     <xsl:variable name="xml-data"> 
      <rate lob="15"> 
       <c i="0" desc="Policy"> 
        <xsl:call-template name="policy-inception-date"/> 
        <xsl:call-template name="policy-expiration-date"/> 
        <xsl:call-template name="primary-sic-code"/> 

       </c> 
      </rate>    
     </xsl:variable> 
     <xsl:value-of select="serialize($xml-data)"/> 
    </aXMLInput> 
</xsl:template> 

и убедитесь, что вы установили

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

В старых версиях Saxon, вы можете использовать функцию расширения для выполнения аналогичной работы.