2013-09-02 3 views
0

은 가정하자 나는 내가 그 XML을 렌더링하고 싶은 부분은 새로운 요소 아래에 XSLT를 사용하는 것을 복사이xslt에서 네임 스페이스를 유지하는 방법?

<a> 
    <b> 
    <c> 
     <n xmlns="http://www.abcd.com/play/soccer" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://www.abcd.com/bgft"> 
     <document> 
      <docbody> 
       ...... 
       ...... 
       ...... 
      </docbody> 
      </document> 
     </n> 
    </c> 
    </b> 
</a> 

같은 XML 파일이 있습니다. 하지만 문제는 그 XML 요소를 그 네임 스페이스로 렌더링 할 수 없다는 것입니다. 그래서 xslt를 통해 해당 네임 스페이스를 제거해야하지만 내 출력 XML에서 해당 네임 스페이스가 필요합니다. 내 출력 XML은 그렇게되어야합니다. 여기

<m> 
    <n> 
    <o> 
     <n xmlns="http://www.abcd.com/play/soccer" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://www.abcd.com/bgft"> 
      <abc> 
       <document> 
       <docbody> 
        ...... 
        ...... 
        ...... 
       </docbody> 
       </document> 
      </abc> 
     </n> 
     </o> 
    </n> 
</m> 

제가

소자 분리 스페이스 통과 복사 AMD 최종 출력에서의 네임 스페이스를 유지할 수있는 방법을 새로운 요소

입니까? 도와주세요.

답변

1

왜 네임 스페이스를 제거한 다음 복원 할 것인지 이해가되지 않습니다. 작업이 완료되는 o 요소로 변환하는 동안 단순히 c 요소의 자식 노드를 복사하는 경우 :

더 "추가"또는 여기에 어떤 네임 스페이스의 "제거"없습니다
<xsl:template match="@* | node()"> 
    <xsl:copy> 
    <xsl:apply-templates select="@* | node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="c"> 
    <o> 
    <xsl:apply-templates/> 
    </o> 
</xsl:template> 

<xsl:template match="a"> 
    <m> 
    <xsl:apply-templates/> 
    </m> 
</xsl:template> 

<xsl:template match="b"> 
    <n> 
    <xsl:apply-templates/> 
    </n> 
</xsl:template> 
+0

답장 보내 주셔서 감사합니다. 내 출력은 기본적으로 미리 정의 된 형식입니다. 내가 그 요소를 복사해야합니다. 내 주요 문제는 의 mnamespaces 및 출력 형식을 유지하는 것입니다. 내 질문에 그 요소를 복사 할 수 있지만 그 때문에 네임 스페이스를 제거해야했습니다. 그러나 출력 형식에 따라 이러한 네임 스페이스를 포함해야합니다. 어떻게 그 네임 스페이스를 유지할 수 있는지 말해주십시오. – Mike

0

, 당신은 단순히 요소 이름을 번역하고 a, bm-c (NO 네임 스페이스)와 no (또한, 네임 스페이스)에 원래 {http://www.abcd.com/play/soccer}n 요소와 그 자식 사이 http://www.abcd.com/play/soccer 공간에서 abc 원소를 첨가.

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" 
       xmlns:play="http://www.abcd.com/play/soccer" 
       exclude-result-prefixes="play"> 

    <!-- identity template - copy everything as-is unless we say otherwise --> 
    <xsl:template match="@*|node()"> 
    <xsl:copy><xsl:apply-templates select="@*|node()" /></xsl:copy> 
    </xsl:template> 

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

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

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

    <!-- Match the original <n xmlns="http://www.abcd.com/play/soccer"> element. 
     We have to use a prefix for this because no prefix always means no 
     namespace in XPath --> 
    <xsl:template match="play:n"> 
    <xsl:copy> 
     <!-- preserve the xsi:schemaLocation attribute --> 
     <xsl:apply-templates select="@*" /> 
     <!-- insert an abc element in the right namespace --> 
     <abc xmlns="http://www.abcd.com/play/soccer"> 
     <xsl:apply-templates /> 
     </abc> 
    </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 
+0

답장을 보내 주셔서 감사합니다. 내 출력은 기본적으로 미리 정의 된 형식입니다. 내가 그 요소를 복사해야합니다. 내 주요 문제는 의 mnamespaces 및 출력 형식을 유지하는 것입니다. 내 질문에 그 요소를 복사 할 수 있지만 그 때문에 네임 스페이스를 제거해야했습니다. 그러나 출력 형식에 따라 이러한 네임 스페이스를 포함해야합니다. 어떻게 그 네임 스페이스를 유지할 수 있는지 말해주십시오. – Mike

+0

@SubhadipBanerjee 네임 스페이스를 "추가"하고 "제거"하는 것이 무슨 뜻인지 아직도 이해하지 못합니다. 입력 및 출력 XML에 대해이 스타일 시트는 사용자가 요구 한 것과 정확히 일치 할 것입니다. 필요하지 않은 경우 실제 입력 및 출력과 시도한 XSLT의보다 현실적인 예를 사용하여 다른 질문을 만드십시오. 멀리. –

관련 문제