2010-03-11 5 views
1

TV 방송 목록이 포함 된 거대한 XML 파일을 얻습니다. 그리고 하루 종일 모든 방송을 포함하는 작은 파일로 분할해야합니다. 나는 그 일을 처리했지만 xml 헤더와 노드가 여러 번있는 두 가지 문제가 있습니다.XSL을 사용하여 거대한 XML 파일을 작은 xml 파일로 분할하는 방법

는 XML의 구조는 다음

<?xml version="1.0" encoding="UTF-8"?> 
<broadcasts> 
    <broadcast> 
    <id>4637445812</id> 
    <week>39</week> 
    <date>2009-09-22</date> 
    <time>21:45:00:00</time> 
     ... (some more) 
    </broadcast> 
    ... (long list of broadcast nodes) 
</broadcasts> 

내 XSL은 다음과 같습니다

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
     xmlns:redirect="http://xml.apache.org/xalan/redirect" 
     extension-element-prefixes="redirect" 
     version="1.0"> 
    <!-- mark the CDATA escaped tags --> 
    <xsl:output method="xml" cdata-section-elements="title text" 
     indent="yes" omit-xml-declaration="no" /> 

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

    <xsl:template match="broadcast"> 
    <!-- Build filename PRG_YYYYMMDD.xml --> 
    <xsl:variable name="filename" select="concat(substring(date,1,4),substring(date,6,2))"/> 
    <xsl:variable name="filename" select="concat($filename,substring(date,9,2))" /> 
    <xsl:variable name="filename" select="concat($filename,'.xml')" /> 
    <redirect:write select="concat('PRG_',$filename)" append="true">  

     <schedule> 
     <broadcast program="TEST"> 
      <!-- format timestamp in specific way --> 
      <xsl:variable name="tmstmp" select="concat(substring(date,9,2),'/')"/> 
      <xsl:variable name="tmstmp" select="concat($tmstmp,substring(date,6,2))"/> 
      <xsl:variable name="tmstmp" select="concat($tmstmp,'/')"/> 
      <xsl:variable name="tmstmp" select="concat($tmstmp,substring(date,1,4))"/> 
      <xsl:variable name="tmstmp" select="concat($tmstmp,' ')"/> 
      <xsl:variable name="tmstmp" select="concat($tmstmp,substring(time,1,5))"/> 

      <timestamp><xsl:value-of select="$tmstmp"/></timestamp> 
      <xsl:copy-of select="title"/> 
      <text><xsl:value-of select="subtitle"/></text> 

      <xsl:variable name="newVps" select="concat(substring(vps,1,2),substring(vps,4,2))"/> 
      <xsl:variable name="newVps" select="concat($newVps,substring(vps,7,2))"/> 
      <xsl:variable name="newVps" select="concat($newVps,substring(vps,10,2))"/> 
      <vps><xsl:value-of select="$newVps"/></vps>      
      <nextday>false</nextday>    
     </broadcast>  
     </schedule> 
    </redirect:write> 
    </xsl:template> 
</xsl:stylesheet> 

내 출력 XMLS이 같다 :

PRG_20090512.xml :

<?xml version="1.0" encoding="UTF-8"?> 
    <schedule> 
    <broadcast program="TEST"> 
     <timestamp>01/03/2010 06:00</timestamp> 
     <title><![CDATA[TELEKOLLEG Geschichte ]]></title> 
     <text><![CDATA[Giganten in Fernost]]></text> 
     <vps>06000000</vps> 
     <nextday>false</nextday> 
    </broadcast> 
    </schedule> 
<?xml version="1.0" encoding="UTF-8"?> <!-- don't want this --> 
    <schedule> <!-- don't want this --> 
    <broadcast program="TEST"> 
     <timestamp>01/03/2010 06:30</timestamp> 
     <title><![CDATA[Die chemische Bindung]]></title> 
     <text/> 
     <vps>06300000</vps> 
     <nextday>false</nextday> 
    </broadcast> 
    </schedule> 
<?xml version="1.0" encoding="UTF-8"?> 
...and so on 

출력 선언에 omit-xml-declaration = "yes"를 넣을 수 있지만 xml 헤더가 없습니다.

<xsl:choose> 
    <xsl:when test="count(schedule) = 0"> <!-- schedule needed --> 
    <schedule> 
     <broadcast> 
    ... 
    <xsl:otherwise> <!-- no schedule needed --> 
    <broadcast> 
    ... 

덕분에 어떤 도움을,로 : 나는

내가 뭘하려 ... 태그가 출력에 이미있는 경우 체크에 넣어하려고했으나 출력 노드를 선택하는 데 실패 나는 그것을 어떻게 다룰 지 모릅니다. ;. ( 설인

답변

1

쓰기 해당 날짜의 모든 브로드 캐스트를 포함하는 한 번에 하나의 파일.

이는 입력 요소를 날짜별로 그룹화하는 문제가됩니다. Xalan은 XSLT 1.0이므로 키를 사용하면됩니다.

브로드 캐스트를 그룹화 할 키를 날짜별로 정의합니다. 날짜의 첫 번째 인 각 방송을 선택합니다. 그런 다음 키 기능을 사용하여 같은 날짜의 모든 브로드 캐스트를 선택하십시오.

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:redirect="http://xml.apache.org/xalan/redirect" 
       extension-element-prefixes="redirect" 
       version="1.0"> 

    <!-- mark the CDATA escaped tags --> 
    <xsl:output method="xml" cdata-section-elements="title text" indent="yes" omit-xml-declaration="no" /> 

    <xsl:key name="date" match="broadcast" use="date" /> 

    <xsl:template match="broadcasts"> 
     <xsl:apply-templates select="broadcast[generate-id(.)=generate-id(key('date',date)[1])]"/> 
    </xsl:template> 

    <xsl:template match="broadcast"> 
     <!-- Build filename PRG_YYYYMMDD.xml --> 
     <xsl:variable name="filename" select="concat(substring(date,1,4),substring(date,6,2))"/> 
     <xsl:variable name="filename" select="concat($filename,substring(date,9,2))" /> 
     <xsl:variable name="filename" select="concat($filename,'.xml')" /> 

     <redirect:write select="concat('PRG_',$filename)" append="true">   

      <schedule> 
       <xsl:apply-templates select="key('date',date)" mode="broadcast" /> 
      </schedule> 

     </redirect:write> 

    </xsl:template> 

    <xsl:template match="broadcast" mode="broadcast"> 
     <broadcast program="TEST"> 
      <!-- format timestamp in specific way --> 
      <xsl:variable name="tmstmp" select="concat(substring(date,9,2),'/')"/> 
      <xsl:variable name="tmstmp" select="concat($tmstmp,substring(date,6,2))"/> 
      <xsl:variable name="tmstmp" select="concat($tmstmp,'/')"/> 
      <xsl:variable name="tmstmp" select="concat($tmstmp,substring(date,1,4))"/> 
      <xsl:variable name="tmstmp" select="concat($tmstmp,' ')"/> 
      <xsl:variable name="tmstmp" select="concat($tmstmp,substring(time,1,5))"/> 

      <timestamp><xsl:value-of select="$tmstmp"/></timestamp> 
      <xsl:copy-of select="title"/> 
      <text><xsl:value-of select="subtitle"/></text> 

      <xsl:variable name="newVps" select="concat(substring(vps,1,2),substring(vps,4,2))"/> 
      <xsl:variable name="newVps" select="concat($newVps,substring(vps,7,2))"/> 
      <xsl:variable name="newVps" select="concat($newVps,substring(vps,10,2))"/> 
      <vps><xsl:value-of select="$newVps"/></vps>          
      <nextday>false</nextday>        
     </broadcast> 
    </xsl:template> 

</xsl:stylesheet> 
+0

soooo 많은 감사합니다! 그것이 내가 필요한 것입니다! ;) –

0

고유 부모 일정 요소를 싸서 그 문제가 사라질가 있는지 확인

나는이 특정 문제에 익숙하지 해요,하지만 내 생각은 당신의 노력에 의한 것이다 최상위 요소가 여러 개인 XML 문서를 생성합니다. 모든 XML 문서는 정확히 최상위 요소 하나를 가져야합니다 (예를 들어 나에게 묻는 경우 멍청한 요구입니다. 예를 들어 XML이 로그 파일에 적합하지 않지만 그 방법은 그대로입니다.)

관련 문제