2014-10-30 3 views
0

XSLT를 사용하여 다른 형식으로 변환해야하는 XML 요소가 있습니다. 아래 요청 및 응답 XML을 게시했습니다. XSLT를 처음 사용하기 때문에 요청을 응답 형식으로 변환하는 데 도움이 필요합니다.xslt를 사용하여 네임 스페이스를 제거하고 출력 요소를 업데이트하는 방법

요청 :

<p:ReservationRequest xmlns:p="http://sample.request.com/"> 
     <!--Exactly 1 occurrence--> 
     <p:Reservation> 
     <p:tktReservationGUID>13579</p:tktReservationGUID> 
     <p:tktState>CA</p:tktState> 
     <p:LocationId>1357</p:LocationId> 
     </p:Reservation> 
    </p:ReservationRequest> 

응답 :

내가 요청 요소 떨어져 네임 스페이스를 제거하고 아래 응답에서 CDATA를 사용하여 추가 할 필요가
<tem:SendReservation xmlns:tem="http://tempuri.org/"> 
    <!--Optional:--> 
    <tem:ProviderGuid xmlns:tem="http://tempuri.org/">1111</tem:ProviderGuid> 
    <!--Optional:--> 
    <tem:Username xmlns:tem="http://tempuri.org/">usertext</tem:Username> 
    <!--Optional:--> 
    <tem:Password xmlns:tem="http://tempuri.org/">passtext</tem:Password> 
    <!--Optional:--> 
    <tem:Data><![CDATA[<DATA> <Reservation> 

    <tktReservationGUID>54321</tktReservationGUID> 
    <tktState>CA</tktState> 
    <LocationId>1357</LocationId> 
    </Reservation> </DATA>]]></tem:Data> 
    </tem:SendReservation> 

"편 : 데이터를"다른를 추가 한 후 마스터 요소 "DATA"를 요청 요소에 전달합니다.

XSLT를 사용하여 게시 된 응답으로 다음 요청을 변환하는 것에 관해서 정말 도움을 주시면 감사하겠습니다.

감사합니다, Rudraksh

+0

당신이 색슨 9.6과 XSLT 3.0을 사용할 수 있습니까? 또는 XSLT 프로세서를 사용하는 XSLT 버전을 선택하십시오. –

답변

2

당신이 변형 일시적으로 트리를 변환하는 serialize 기능의 사용이 마크 업 할 수 있습니다 가정 XSLT 3.0과 색슨 9.6 :

<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:p="http://sample.request.com/" 
    xmlns:tem="http://tempuri.org/" 
    exclude-result-prefixes="p tem" 
    version="3.0"> 

<xsl:output indent="yes" cdata-section-elements="tem:Data" omit-xml-declaration="yes"/> 

<xsl:template match="/"> 
    <tem:SendReservation xmlns:tem="http://tempuri.org/"> 
    <!--Optional:--> 
    <tem:ProviderGuid xmlns:tem="http://tempuri.org/">1111</tem:ProviderGuid> 
    <!--Optional:--> 
    <tem:Username xmlns:tem="http://tempuri.org/">usertext</tem:Username> 
    <!--Optional:--> 
    <tem:Password xmlns:tem="http://tempuri.org/">passtext</tem:Password> 
    <!--Optional:--> 
    <tem:Data> 
     <xsl:variable name="data"> 
     <DATA> 
      <xsl:apply-templates select="p:ReservationRequest"/> 
     </DATA> 
     </xsl:variable> 
     <xsl:variable name="ser-params"> 
      <output:serialization-parameters 
       xmlns:output="http://www.w3.org/2010/xslt-xquery-serialization"> 
      <output:indent value="yes"/> 
      <output:version value="1.0"/> 
      <output:method value="xml"/> 
      <output:omit-xml-declaration value="yes"/> 
      </output:serialization-parameters> 
     </xsl:variable> 
     <xsl:value-of select="serialize($data/*, $ser-params/*)"/> 
    </tem:Data> 
    </tem:SendReservation> 
</xsl:template> 

<xsl:template match="p:*"> 
    <xsl:element name="{local-name()}"> 
    <xsl:apply-templates/> 
    </xsl:element> 
</xsl:template> 

</xsl:stylesheet> 

그 방법은 결과가

입니다
<tem:SendReservation xmlns:tem="http://tempuri.org/"> 
    <tem:ProviderGuid>1111</tem:ProviderGuid> 
    <tem:Username>usertext</tem:Username> 
    <tem:Password>passtext</tem:Password> 
    <tem:Data><![CDATA[<DATA> 
    <ReservationRequest> 

     <Reservation> 
     <tktReservationGUID>13579</tktReservationGUID> 
     <tktState>CA</tktState> 
     <LocationId>1357</LocationId> 
     </Reservation> 
    </ReservationRequest> 
</DATA>]]></tem:Data> 
</tem:SendReservation> 

XSLT 1.0을 사용해야하는 경우 순수 XSLT 1에 구현 된 직렬 변환기를 사용하는 샘플이 있습니다. 0과 exsl:node-set 기능 :

<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:p="http://sample.request.com/" 
    xmlns:tem="http://tempuri.org/" 
    xmlns:exsl="http://exslt.org/common" 
    exclude-result-prefixes="p tem exsl" 
    version="1.0"> 

<xsl:import href="http://lenzconsulting.com/xml-to-string/xml-to-string.xsl"/> 

<xsl:output indent="yes" cdata-section-elements="tem:Data" omit-xml-declaration="yes"/> 

<xsl:template match="/"> 
    <tem:SendReservation xmlns:tem="http://tempuri.org/"> 
    <!--Optional:--> 
    <tem:ProviderGuid xmlns:tem="http://tempuri.org/">1111</tem:ProviderGuid> 
    <!--Optional:--> 
    <tem:Username xmlns:tem="http://tempuri.org/">usertext</tem:Username> 
    <!--Optional:--> 
    <tem:Password xmlns:tem="http://tempuri.org/">passtext</tem:Password> 
    <!--Optional:--> 
    <tem:Data> 
     <xsl:variable name="data"> 
     <DATA> 
      <xsl:apply-templates select="p:ReservationRequest"/> 
     </DATA> 
     </xsl:variable> 
     <xsl:apply-templates select="exsl:node-set($data)/*" mode="xml-to-string"/> 
    </tem:Data> 
    </tem:SendReservation> 
</xsl:template> 

<xsl:template match="p:*"> 
    <xsl:element name="{local-name()}"> 
    <xsl:apply-templates/> 
    </xsl:element> 
</xsl:template> 

</xsl:stylesheet> 
+0

Martin, 솔루션에 감사드립니다. 그러나이 옵션은 XSLT 엔진에서 지원되지 않습니다. 우리는 여전히 우리 엔진의 일부로 xsl 1.0을 사용하고 있습니다. xsl 1.0을 사용하여 수행 할 수있는 솔루션이 있습니까? – Rudraksh

+0

XSLT 1.0 프로세서가 트리를 직렬화하거나 코드에서 http://lenzconsulting.com/xml-to-string/과 같은 순수 XSLT 1.0 솔루션을 통합하기위한 확장 기능을 제공하는지 여부를 확인하십시오. –

+0

@Rudraksh, 나는 이전의 주석에서 링크 된 라이브러리 모듈'xml-to-string'을 사용하여 XSLT 1.0 샘플을 추가했습니다. –

1

내가 조금 내 대답에 밀접하게 닮은 입력 요청을 변경 할 수 있었다. 나는 그것을 변형시키는 데 사용 된 XSLT와 함께 새로운 요청을 게시했다.

새로운 요청 :

<p:ReservationRequest xmlns:p="http://sample.request.com/"> 
    <p:DATA> 
     <!--Exactly 1 occurrence--> 
     <p:Reservation> 
     <p:tktReservationGUID>13579</p:tktReservationGUID> 
     <p:tktState>CA</p:tktState> 
     <p:LocationId>1357</p:LocationId> 
     </p:Reservation> 
    </p:DATA> 
</p:ReservationRequest> 

새로운 XSLT :

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:tem="http://tempuri.org/" xmlns:p="http://sample.request.com/" exclude-result-prefixes="p tem" version="1.0"> 
     <xsl:output indent="yes" cdata-section-elements="tem:Data"/> 
     <xsl:template match="/"> 
     <tem:SendReservation> 
      <!--Optional:--> 
      <tem:ProviderGuid>1111</tem:ProviderGuid> 
      <!--Optional:--> 
      <tem:Username>usertest</tem:Username> 
      <!--Optional:--> 
      <tem:Password>passtest</tem:Password> 
      <!--Optional:--> 
      <tem:Data> 
       <xsl:text disable-output-escaping="yes">&lt;![CDATA[</xsl:text> 
       <xsl:apply-templates select="/p:ReservationRequest/p:DATA"></xsl:apply-templates> 
       <xsl:text disable-output-escaping="yes">]]&gt;</xsl:text> 
      </tem:Data> 
     </tem:SendReservation> 
     </xsl:template> 
     <xsl:template match="*"> 
     <xsl:element name="{local-name()}"> 
      <xsl:apply-templates select="@*|node()"></xsl:apply-templates> 
     </xsl:element> 
     </xsl:template> 
     <xsl:template match="@*"> 
     <xsl:attribute name="{local-name()}"> 
      <xsl:value-of select="."></xsl:value-of> 
     </xsl:attribute> 
     </xsl:template> 
    </xsl:stylesheet> 

응답 :

<tem:SendReservation xmlns:tem="http://tempuri.org/"> 
    <tem:ProviderGuid>1111</tem:ProviderGuid> 
    <tem:Username>usertest</tem:Username> 
    <tem:Password>passtest</tem:Password> 
    <tem:Data><![CDATA[<DATA> 
     <Reservation> 
     <tktReservationGUID>13579</tktReservationGUID> 
     <tktState>CA</tktState> 
     <LocationId>1357</LocationId> 
     </Reservation> 
</DATA>]]></tem:Data> 
</tem:SendReservation>