2013-04-23 3 views
0

xslt를 처음 사용합니다. 한 스키마의 XML을 다른 스키마로 변환하려고합니다. 변환 후 이전 네임 스페이스를 "제거"하고 싶습니다. 변환 자체에 이전 스키마가 필요한 경우 변환 후에 해당 스키마를 지우려면 어떻게해야합니까? 본질적으로, 나는 http://positionskillmanagementservice.webservices.com을 없애고 전적으로 http://newschema (노드 이름을 변경 한 후)으로 대체하려고합니다.xslt를 사용하여 이전 네임 스페이스 제거

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

    <xsl:output method="xml" /> 

    <xsl:template match="ns:return"> 
    <parameter> 
     <xsl:apply-templates select="@*|node()"/> 
    </parameter> 
    </xsl:template> 

    <xsl:template match="ns:position"> 
    <parameter> 
     <xsl:apply-templates select="@*|node()"/> 
    </parameter> 
    </xsl:template> 

    <xsl:template match="ns:positionSkillResponse"> 
    <positionSkillRequest > 
     <xsl:apply-templates select="@*|node()"/> 
    </positionSkillRequest > 
    </xsl:template> 

    <xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
    </xsl:template>  

    <xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

내가 일을 확인하고 있습니다 :

<ns:positionSkillResponse xmlns:ns="http://positionskillmanagementservice.webservices.com"> 
<ns:return>1</ns:return> 
<ns:return>9</ns:return> 
</ns:positionSkillResponse> 

이는 XSLT이다 : 나는에서 Dimitre Novatchev의 방법을 통해 내가 원하는 걸의 대부분을 할 수 있어요 다음 XML change the namespace of an element with xslt

이있다 this tool.

답변

1

귀하의 시도는 너무 구체적입니다. 보십시오이 더 일반적인 하나

<ns:positionSkillResponse xmlns:ns="http://newschema"> 
    <ns:return>1</ns:return> 
    <ns:return>9</ns:return> 
</ns:positionSkillResponse> 

참고

  • 당신은 당신이 실제로에서 노드를 가지고 있지 않기 때문에 XSLT에 xmlns:ns="http://newschema"를 선언 할 필요가 없습니다 : 제공

    <xsl:stylesheet 
        version="1.0" 
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
        xmlns:ns_old="http://positionskillmanagementservice.webservices.com" 
    >  
        <xsl:output method="xml" /> 
    
        <!-- matches any node not handled elsewhere --> 
        <xsl:template match="@*|node()"> 
         <xsl:copy> 
          <xsl:apply-templates select="@*|node()"/> 
         </xsl:copy> 
        </xsl:template>  
    
        <!-- matches elements in the old namespace, re-creates them in the new --> 
        <xsl:template match="ns_old:*"> 
         <xsl:element name="ns:{local-name()}" namespace="http://newschema"> 
          <xsl:apply-templates select="@*|node()"/> 
         </xsl:element> 
        </xsl:template> 
    
        <!-- if you don't have namespaced attributes you won't need this template --> 
        <xsl:template match="@ns_old:*"> 
         <xsl:attribute name="ns:{local-name()}" namespace="http://newschema"> 
          <xsl:value-of select="."/> 
         </xsl:attribute> 
        </xsl:template> 
    </xsl:stylesheet> 
    

    당신의 입력 문서에서 그 네임 스페이스.

  • 이렇게하면 이전 네임 스페이스를 xmlns:ns="http://positionskillmanagementservice.webservices.com"으로 선언하고 <xsl:template match="ns:*">과 같이 사용할 수 있습니다. XSL 프로세서와 완전히 같지만 ns_old과 같은 다른 접두사를 사용하면 사람이 혼동하지 않을 것입니다.
  • 출력 프리픽스를 임의로 선택할 수 있습니다 (<xsl:element name="ns:{local-name()}" ...). 이것은 XSLT에서 선언 된 네임 스페이스와 아무런 관련이 없습니다. 전혀 접두사를 사용하지 않는 것은 기본 네임 스페이스와 문서 초래 : Tomalak는 당신에게 당신의 변환을 작성하는 더 좋은 방법을 보여 주었다, 그러나 진짜로 당신의 즉각적인 질문에 대답하지 않은

    <positionSkillResponse xmlns="http://newschema"> 
        <return>1</return> 
        <return>9</return> 
    </positionSkillResponse> 
    
2

. 스타일 시트에서 리터럴 결과 요소 (예 : <a>...</a>)를 사용하면 몇 가지 예외를 제외하고는 스타일 시트의 해당 요소에 대한 범위에있는 모든 네임 스페이스와 함께 결과로 복사됩니다. 예외 중 하나는 네임 스페이스가 exclude-result-prefixes 요소에 나열되는 경우 네임 스페이스가 생략된다는 것입니다.이 요소는 일반적으로 네임 스페이스 선언과 함께 xsl : stylesheet 요소에 배치됩니다. 따라서 Tomalak이 제안한 것처럼 스타일 시트를 리팩터링하지 않았다면 exclude-result-prefixes = "ns"를 xsl : stylesheet 요소에 추가하여 네임 스페이스를 삭제할 수있었습니다.

관련 문제