2009-12-01 4 views
1

요청 및 응답 XML은 여러 네임 스페이스를 사용하는 xsds에 의해 정의되며 100 개의 요소가 정의되어 있습니다. in xsds. 그러나 웹 서비스는 XML에서 네임 스페이스를 사용하지 않는 레거시 레이어를 호출합니다. 따라서 웹 서비스와 xslt를 사용하여 요청 및 응답 XML을 변환하는 레거시 계층간에 변환 계층이 있습니다. 변환 과정에서 xslt를 사용하여 요청 XML에서 네임 스페이스 접두사를 제거합니다.이 접두사는 일치하는 소수의 네임 스페이스 접두사 만 있기 때문에 정상적으로 작동합니다.xslt를 사용하여 xml에 네임 스페이스를 추가하는 방법

그러나 나가는 길에 응답에 네임 스페이스 접두어를 다시 추가 할 xslt가 필요하며이를 수행하는 방법을 모르겠습니다. 응답은 수십 개의 다른 요소 유형으로 구성 될 수 있습니다. xsds의 여러 다른 네임 스페이스 중 하나에 속할 수 있습니다. 나는이 점을 변환 할 필요가

<order> 
    <item name="table"/> 
    <customer name="jim"/> 
</order> 

: 예를 들어, 나는이 같은 응답을 가질 수있다

<order 
    xmlns:types1="http://types1.company.com" xmlns:types2="http://types2.company.com"> 
    <types1:item name="table"/> 
    <types2:customer name="jim"/> 
</order> 

것은이 작업을 수행 할 수있는 유일한 방법입니다 것은 일치하는 XSLT에 큰 테이블을 가지고있다 사용되어야하는 접두어에 대한 응답의 요소 이름 (예 : "item", "customer")?

xml로 xsd로로드 한 코드를 수정 한 다음 xsd의 요소에 응답 요소를 일치시키고 올바른 네임 스페이스를 파생시키는 것이 더 낫지는 않습니까?

+0

같은 이름이 여러 네임 스페이스에 나타날 경우 사용할 네임 스페이스를 어떻게 결정합니까? –

+0

예, 잠재적 인 문제이며, xsds에 대한 실제 문제인지 여부는 아직 알 수 없습니다. 그것이 발생한다면 아마 유일한 일치를 얻을 때까지 나는 조상 요소를 체크하는 것에 너무 의지 할 것이다. – Polyfun

답변

1

나는이 같은 일을 할 수 있다고 생각 : 나를 위해

<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
> 

    <!-- the identity template to copy everything as it is --> 
    <xsl:template match="node() | @*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node() | @*" /> 
    </xsl:copy> 
    </xsl:template> 

    <!-- elements are re-created with a namespace --> 
    <xsl:template match="*"> 

    <xsl:variable name="ns-uri"> 
     <xsl:choose> 
     <xsl:when test="name() = 'item' and name(..) = 'order'"> 
      <xsl:text>http://types1.company.com</xsl:text> 
     </xsl:when> 
     <xsl:when test="name() = 'customer' and name(..) = 'order'"> 
      <xsl:text>http://types2.company.com</xsl:text> 
     </xsl:when> 
     <!-- otherwise: nothing --> 
     </xsl:choose> 
    </xsl:variable> 

    <!-- create the element with the correct namespace -->  
    <xsl:element name="{name()}" namespace="{$ns-uri}"> 
     <xsl:apply-templates select="node() | @*" /> 
    </xsl:element> 
    </xsl:template> 

</xsl:stylesheet> 

출력은 다음과 같습니다

<order> 
    <item name="table" xmlns="http://types1.company.com"></item> 
    <customer name="jim" xmlns="http://types2.company.com"></customer> 
</order> 

당신이 무엇을 어느 그냥 접두사없이. 정보 세트는 정확히 같습니다.

+0

유망 해 보입니다. 다른 변수를 만들어 접두사를 저장하고 다른 xsl : 일치하는 이름()에 따라 접두사를 설정하도록 선택합니다. – Polyfun

관련 문제