2017-12-18 23 views
-1

내 xslt 코드에서 copy-of를 사용하여 요소와 그 자손 노드를 복사 할 수 있지만 결과 스키마는 동일한 구조를 갖지만 다른 구조를가집니다. 네임 스페이스. 여전히 사본을 사용하고이를 수행 할 수있는 방법이 있습니까? XSLT 2.0을 사용 중입니다결과 문서의 다른 네임 스페이스에 xslt 복사

다음은 소스 및 대상 XML의 예입니다. cd 요소는 XSL의 copy-of를 사용하여 복사 할 수 있지만 다른 네임 스페이스가 있습니다.

소스 XML

<catalog xmlns="namespace1"> 
    <cd> 
    <title>Empire Burlesque</title> 
    <artist>Bob Dylan</artist> 
    <country>USA</country> 
    <company>Columbia</company> 
    <price>10.90</price> 
    <year>1985</year> 
    </cd> 
    <cd> 
    <title>Hide your heart</title> 
    <artist>Bonnie Tyler</artist> 
    <country>UK</country> 
    <company>CBS Records</company> 
    <price>9.90</price> 
    <year>1988</year> 
    </cd> 
</catalog> 

대상 XML

<books xmlns="namespace2"> 
    <cd> 
    <title>Empire Burlesque</title> 
    <artist>Bob Dylan</artist> 
    <country>USA</country> 
    <company>Columbia</company> 
    <price>10.90</price> 
    <year>1985</year> 
    </cd> 
    <cd> 
    <title>Hide your heart</title> 
    <artist>Bonnie Tyler</artist> 
    <country>UK</country> 
    <company>CBS Records</company> 
    <price>9.90</price> 
    <year>1988</year> 
    </cd> 
</books> 

마틴 Honnen의 아이디어를 사용하고 생성이

<xsl:template name="changeNamespace"> 
<xsl:param name="nodes"/> 
<xsl:for-each select="$nodes"> 
    <xsl:choose> 
    <xsl:when test="count(child::*)>0"> 
     <xsl:element name="newnamespace:{local-name()}"> 
     <xsl:call-template name="changeNamespace"> 
      <xsl:with-param name="nodes" select="./child::*"/> 
     </xsl:call-template> 
     </xsl:element> 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:element name="newnamespace:{local-name()}"> 
     <xsl:value-of select="."/> 
     </xsl:element> 
    </xsl:otherwise> 
    </xsl:choose> 
</xsl:for-each> 

+0

코드로 문제를 제대로 설명해 주실 수 있습니까? – Shuvra

답변

1

당신은 사용할 수 없습니다 xsl:copy 또는 xsl:copy-of 노드의 네임 스페이스를 변경하려면 예를 들어 노드를 변형해야합니다.

<xsl:template match="ns1:*"> 
    <xsl:element name="ns2:{local-name()}"> 
    <xsl:apply-templates select="@* | node()"/> 
    </xsl:element> 
</xsl:template> 

예 : 범위 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns1="source-namespace" xmlns:ns2="target-namespace" version="1.0"> 또는 당신은 물론 또한 xsl:element에 대상 네임 스페이스를 넣을 수 있습니다 :

<xsl:template match="ns1:*"> 
    <xsl:element name="ns2:{local-name()}" namespace="target-namespace"> 
    <xsl:apply-templates select="@* | node()"/> 
    </xsl:element> 
</xsl:template> 

당신은 당신이 속성 노드에 대한 유사한 템플릿을 설정해야 네임 스페이스를 변경해야하는 속성이있는 경우

.

XSLT 2.0을 사용하면 스타일 시트 구조를 단순화 할 수 있습니다.

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xpath-default-namespace="namespace1" xmlns="namespace2" version="2.0"> 

    <xsl:template match="*"> 
     <xsl:element name="{local-name()}"> 
     <xsl:apply-templates select="@* | node()"/> 
     </xsl:element> 
    </xsl:template> 
+0

Martin 감사합니다. xsl : copy-of가 실행 된 후이 템플릿을 실행하여 네임 스페이스를 변경할 수 있습니까? 나는 xsl : copy-of가있는 첫 번째 XSL을 실행할 수 있으며 그 결과를 사용하여 네임 스페이스를 변경하는 템플릿이있는 다른 XSL을 실행합니다. 그러나이 두 가지를 하나의 XSL에 결합 할 수있는 방법이 있습니까? – jay26

+0

왜 내가 먼저 두 번째 단계로 변환하기 위해 무언가를 복사하려고하는지 확신 할 수 없지만 XSLT 2에서는 처리 방법을 구분하기 위해 모드를 사용하는 것이 좋습니다. 즉 제안을 설정하십시오. '그리고''. –