XSLT

2012-03-13 2 views
0
를 사용하여 XML에서 다른 부모 태그와 함께 자식 태그를 얻는 방법을

는 XSLT를 작성하는 내가 원하는 위의 XML 파일을 사용하여 아래에 입력 XML 파일XSLT

<Content> 
     <content1> 
     <first> Hi <dynVar name="abc" /> All </first> 
     <second>this is</second> 
     <content1> 
     <third>input <dynVar name="def" /> xml content</third> 
     <fourth> <dynVar name="ghi" /> </fourth> 
     <fifth> <dynVar name="jkl" /> <dynVar name="mno" /></fifth> 
<Content> 

을 고려하는 것이 나의 출력 XML 파일 후 변환 아래 대상 XML 파일과 같을 것이다 : 입력 XML 파일과 관련된 네임 스페이스 중 하나를 포함하지 한다

<aaa> 
    <bbb> 
     <ccc> Hi <dynVar name="abc" /> All </ccc> 
     <ddd>this is</ddd> 
    <bbb> 
    <eee>input <dynVar name="def" /> xml content</eee> 
    <fff> <dynVar name="ghi" /> </fff> 
    <ggg> <dynVar name="jkl" /> <dynVar name="mno" /></ggg> 
<aaa> 

출력 파일,536,누구나이 솔루션을 줄 수 있습니까?

답변

1

이 (또한 마지막에 짧은 버전 참조)보십시오 : 귀하의 의견에 적용

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 
    <xsl:template match="/"> 
     <xsl:apply-templates/> 
    </xsl:template> 

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

    <xsl:template match="Content"> 
     <aaa> 
      <xsl:apply-templates/> 
     </aaa> 
    </xsl:template> 

    <xsl:template match="content1"> 
     <bbb> 
      <xsl:apply-templates/> 
     </bbb> 
    </xsl:template> 

    <xsl:template match="first"> 
     <ccc> 
      <xsl:apply-templates/> 
     </ccc> 
    </xsl:template> 

    <xsl:template match="second"> 
     <ddd> 
      <xsl:apply-templates/> 
     </ddd> 
    </xsl:template> 

    <xsl:template match="third"> 
     <eee> 
      <xsl:apply-templates/> 
     </eee> 
    </xsl:template> 

    <xsl:template match="fourth"> 
     <fff> 
      <xsl:apply-templates/> 
     </fff> 
    </xsl:template> 

    <xsl:template match="fifth"> 
     <ggg> 
      <xsl:apply-templates/> 
     </ggg> 
    </xsl:template> 

</xsl:stylesheet> 

,이 네임 스페이스를 제외한 들어

<?xml version="1.0" encoding="UTF-8"?> 
<aaa> 
    <bbb> 
     <ccc> Hi <dynVar name="abc"/> All </ccc> 
     <ddd>this is</ddd> 
    </bbb> 
    <eee>input <dynVar name="def"/> xml content</eee> 
    <fff> 
     <dynVar name="ghi"/> 
    </fff> 
    <ggg> 
     <dynVar name="jkl"/> 
     <dynVar name="mno"/> 
    </ggg> 
</aaa> 

을 제공, 추가 제외-결과-속성의 접두사 = " xyz "를 stylesheet 요소에 추가합니다. 여기서 x, y 및 z는 추가로 선언 된 네임 스페이스입니다.

동일을 달성하지만, 노드 이름이 교체되어야하는 각 노드에 대한 템플릿을하지 않는 짧은 버전 :

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" exclude-result-prefixes=""> 
    <xsl:output method="xml" indent="yes"/> 
    <xsl:template match="/"> 
     <xsl:apply-templates/> 
    </xsl:template> 

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

    <xsl:template match="*[name() != 'dynVar']"> 
     <xsl:variable name="eltName"> 
      <xsl:choose> 
       <xsl:when test="name()='Content'">aaa</xsl:when> 
       <xsl:when test="name()='content1'">bbb</xsl:when> 
       <xsl:when test="name()='first'">ccc</xsl:when> 
       <xsl:when test="name()='second'">ddd</xsl:when> 
       <xsl:when test="name()='third'">eee</xsl:when> 
       <xsl:when test="name()='fourth'">fff</xsl:when> 
       <xsl:when test="name()='fifth'">ggg</xsl:when> 
       <xsl:otherwise>error</xsl:otherwise> 
      </xsl:choose> 
     </xsl:variable> 
     <xsl:element name="{$eltName}"> 
      <xsl:apply-templates/> 
     </xsl:element> 
    </xsl:template> 

</xsl:stylesheet>