2013-09-23 2 views
1

중첩 된 요소가있는 새 구조에서 Excel에서 내 보낸 XML 구조를 변환하려고합니다. XSLT v1.0을 사용하는 방법을 알아내는 것이 너무 까다 롭습니다.Excel을 XSLT 1.0을 사용하여 중첩 요소가있는 XML로 변환하는 방법?

내 목표는 결과 데이터의 원하는 lavel에 행 데이터를 넣는 것입니다. 행 2 개 데이터 셀을 가지고

<projects> 
<category name="001"> 
... 
</category> 
</projects> 

경우는 영역을 나타내고 previos 카테고리의 하위 같아야 그래서 행 데이터 만 1 셀을 포함하는 경우, 그것은, 예를 들어 카테고리이다.

<projects> 
<category name="001"> 
<region name="AAA">...</region> 
<region name="BBB">...</region> 
</category> 
</projects> 

행에 3 또는 4 개의 셀이있는 데이터는 해당 계정을 나타내며 이전 지역의 하위 여야합니다. 내가 지금까지 무엇을 좋아

<projects> 
<category name="001"> 
<region name="AAA"> 
<account name="lorem">...</account> 
<account name="ipsum">...</account> 
</region> 
<region name="BBB">...</region> 
... 
</category> 
</projects> 

: 다음은 엑셀에서 XML 파일입니다. 반복되는 행 요소가있는 간단한 구조입니다. 각 행에는 5 개의 셀이 있지만 모든 셀에는 항상 데이터 요소가 포함되지는 않습니다. 이 정보를 사용하여 각 행이 어떤 종류의 정보를 나타내는 지 확인했습니다.

<Table ss:ExpandedColumnCount="6" ss:ExpandedRowCount="69" x:FullColumns="1" x:FullRows="1" ss:StyleID="s62" ss:DefaultColumnWidth="69"> 
    <Row ss:AutoFitHeight="0" ss:Height="14.25"> 
    <Cell ss:Index="2" ss:StyleID="s68"/> 
    <Cell ss:StyleID="s69"/> 
    <Cell ss:StyleID="s68"/> 
    <Cell ss:StyleID="s68"/> 
    <Cell ss:StyleID="s68"/> 
    </Row> 
    <Row ss:AutoFitHeight="0" ss:Height="15"> 
    <Cell ss:Index="2" ss:StyleID="s70"><Data ss:Type="String">Categorie 004</Data></Cell> 
    <Cell ss:StyleID="s71"/> 
    <Cell ss:StyleID="s70"/> 
    <Cell ss:StyleID="s72"/> 
    <Cell ss:StyleID="s70"/> 
    </Row> 
    <Row ss:AutoFitHeight="0" ss:Height="14.25"> 
    <Cell ss:Index="2" ss:StyleID="s68"><Data ss:Type="String">AAA</Data></Cell> 
    <Cell ss:StyleID="s69"/> 
    <Cell ss:StyleID="s69"><Data ss:Type="String">X</Data></Cell> 
    <Cell ss:StyleID="s73"/> 
    <Cell ss:StyleID="s74"><Data ss:Type="Number">0.01</Data></Cell> 
    </Row> 
    <Row ss:AutoFitHeight="0" ss:Height="14.25"> 
    <Cell ss:Index="2" ss:StyleID="s68"/> 
    <Cell ss:StyleID="s69"/> 
    <Cell ss:StyleID="s68"/> 
    <Cell ss:StyleID="s73"/> 
    <Cell ss:StyleID="s68"/> 
    </Row> 
    <Row ss:Height="14.25"> 
    <Cell ss:Index="2" ss:StyleID="s68"/> 
    <Cell ss:StyleID="s69"/> 
    <Cell ss:StyleID="s68"/> 
    <Cell ss:StyleID="s73"/> 
    <Cell ss:StyleID="s68"/> 
    </Row> 
    <Row ss:AutoFitHeight="0" ss:Height="14.25"> 
    <Cell ss:Index="2" ss:StyleID="s68"/> 
    <Cell ss:StyleID="s69"/> 
    <Cell ss:StyleID="s68"/> 
    <Cell ss:StyleID="s73"/> 
    <Cell ss:StyleID="s68"/> 
    </Row> 
    <Row ss:AutoFitHeight="0" ss:Height="15"> 
    <Cell ss:Index="2" ss:StyleID="s70"><Data ss:Type="String">Categorie 001</Data></Cell> 
    <Cell ss:StyleID="s71"/> 
    <Cell ss:StyleID="s70"/> 
    <Cell ss:StyleID="s72"/> 
    <Cell ss:StyleID="s70"/> 
    </Row> 
    <Row ss:AutoFitHeight="0" ss:Height="14.25"> 
    <Cell ss:Index="2" ss:StyleID="s82"><Data ss:Type="String">AAA</Data></Cell> 
    <Cell ss:StyleID="s83"/> 
    <Cell ss:StyleID="s82"/> 
    <Cell ss:StyleID="s84"/> 
    <Cell ss:StyleID="s85"><Data ss:Type="Number">3.0800000000000001E-2</Data></Cell> 
    </Row> 
    <Row ss:AutoFitHeight="0" ss:Height="14.25"> 
    <Cell ss:Index="2" ss:StyleID="s68"><Data ss:Type="String">dolor</Data></Cell> 
    <Cell ss:StyleID="s69"><Data ss:Type="Number">123</Data></Cell> 
    <Cell ss:StyleID="s69"><Data ss:Type="String">A</Data></Cell> 
    <Cell ss:StyleID="s86"/> 
    <Cell ss:StyleID="s74"><Data ss:Type="Number">0.01</Data></Cell> 
    </Row> 
    <Row ss:AutoFitHeight="0" ss:Height="15"> 
    <Cell ss:Index="2" ss:StyleID="s68"><Data ss:Type="String">sit amet</Data></Cell> 
    <Cell ss:StyleID="s69"><Data ss:Type="Number">445</Data></Cell> 
    <Cell ss:StyleID="s69"><Data ss:Type="String">B</Data></Cell> 
    <Cell ss:StyleID="s86"/> 
    <Cell ss:StyleID="s74"><Data ss:Type="Number">0.03</Data></Cell> 
    </Row> 
    <Row ss:AutoFitHeight="0" ss:Height="14.25"> 
    <Cell ss:Index="2" ss:StyleID="s68"><Data ss:Type="String">consetetur</Data></Cell> 
    <Cell ss:StyleID="s69"><Data ss:Type="Number">36</Data></Cell> 
    <Cell ss:StyleID="s69"><Data ss:Type="String">B</Data></Cell> 
    <Cell ss:StyleID="s86"/> 
    <Cell ss:StyleID="s74"><Data ss:Type="Number">8.0000000000000004E-4</Data></Cell> 
    </Row> 
    <Row ss:AutoFitHeight="0" ss:Height="14.25"> 
    <Cell ss:Index="2" ss:StyleID="s82"><Data ss:Type="String">BBB</Data></Cell> 
    <Cell ss:StyleID="s83"/> 
    <Cell ss:StyleID="s82"/> 
    <Cell ss:StyleID="s84"/> 
    <Cell ss:StyleID="s85"><Data ss:Type="Number">0.03</Data></Cell> 
    </Row> 
    <Row ss:AutoFitHeight="0" ss:Height="14.25"> 
    <Cell ss:Index="2" ss:StyleID="s68"><Data ss:Type="String">sadipscing</Data></Cell> 
    <Cell ss:StyleID="s69"><Data ss:Type="Number">666</Data></Cell> 
    <Cell ss:StyleID="s69"><Data ss:Type="String">A</Data></Cell> 
    <Cell ss:StyleID="s86"/> 
    <Cell ss:StyleID="s74"><Data ss:Type="Number">0.01</Data></Cell> 
    </Row> 
    <Row ss:AutoFitHeight="0" ss:Height="15"> 
    <Cell ss:Index="2" ss:StyleID="s68"><Data ss:Type="String">elitr</Data></Cell> 
    <Cell ss:StyleID="s69"><Data ss:Type="Number">97</Data></Cell> 
    <Cell ss:StyleID="s69"><Data ss:Type="String">C</Data></Cell> 
    <Cell ss:StyleID="s86"/> 
    <Cell ss:StyleID="s74"><Data ss:Type="Number">0.02</Data></Cell> 
    </Row> 
    <Row ss:AutoFitHeight="0" ss:Height="15"> 
    <Cell ss:Index="2" ss:StyleID="s68"/> 
    <Cell ss:StyleID="s69"/> 
    <Cell ss:StyleID="s68"/> 
    <Cell ss:StyleID="s73"/> 
    <Cell ss:StyleID="s68"/> 
    </Row> 
    <Row ss:AutoFitHeight="0" ss:Height="14.25"> 
    <Cell ss:Index="2" ss:StyleID="s70"><Data ss:Type="String">Categorie 001</Data></Cell> 
    <Cell ss:StyleID="s71"/> 
    <Cell ss:StyleID="s70"/> 
    <Cell ss:StyleID="s72"/> 
    <Cell ss:StyleID="s70"/> 
    </Row> 
    <Row ss:AutoFitHeight="0" ss:Height="14.25"> 
    <Cell ss:Index="2" ss:StyleID="s82"><Data ss:Type="String">AAA</Data></Cell> 
    <Cell ss:StyleID="s83"/> 
    <Cell ss:StyleID="s82"/> 
    <Cell ss:StyleID="s84"/> 
    <Cell ss:StyleID="s85"><Data ss:Type="Number">0.04</Data></Cell> 
    </Row> 
    <Row ss:AutoFitHeight="0" ss:Height="14.25"> 
    <Cell ss:Index="2" ss:StyleID="s68"><Data ss:Type="String">aliquyam</Data></Cell> 
    <Cell ss:StyleID="s69"><Data ss:Type="Number">65</Data></Cell> 
    <Cell ss:StyleID="s69"><Data ss:Type="String">A</Data></Cell> 
    <Cell ss:StyleID="s86"/> 
    <Cell ss:StyleID="s74"><Data ss:Type="Number">0.02</Data></Cell> 
    </Row> 
    <Row ss:AutoFitHeight="0" ss:Height="14.25"> 
    <Cell ss:Index="2" ss:StyleID="s68"><Data ss:Type="String">ipsum</Data></Cell> 
    <Cell ss:StyleID="s69"><Data ss:Type="Number">99</Data></Cell> 
    <Cell ss:StyleID="s69"><Data ss:Type="String">B</Data></Cell> 
    <Cell ss:StyleID="s86"/> 
    <Cell ss:StyleID="s74"><Data ss:Type="Number">0.02</Data></Cell> 
    </Row> 
    <Row ss:AutoFitHeight="0" ss:Height="14.25"> 
    <Cell ss:Index="2" ss:StyleID="s82"><Data ss:Type="String">BBB</Data></Cell> 
    <Cell ss:StyleID="s83"/> 
    <Cell ss:StyleID="s82"/> 
    <Cell ss:StyleID="s84"/> 
    <Cell ss:StyleID="s85"><Data ss:Type="Number">0.01</Data></Cell> 
    </Row> 
    <Row ss:AutoFitHeight="0" ss:Height="14.25"> 
    <Cell ss:Index="2" ss:StyleID="s68"><Data ss:Type="String">lorem</Data></Cell> 
    <Cell ss:StyleID="s69"><Data ss:Type="Number">321</Data></Cell> 
    <Cell ss:StyleID="s69"><Data ss:Type="String">C</Data></Cell> 
    <Cell ss:StyleID="s86"/> 
    <Cell ss:StyleID="s74"><Data ss:Type="Number">0.01</Data></Cell> 
    </Row> 
    </Table> 

지금까지 필자는 다음 스타일 시트를 만들고 필요에 따라 모든 정보를 필터링 할 수 있습니다.

내 결과

<!-- Filter Excel Cells --> 
<xsl:template match="ss:Row"> 
    <xsl:if test="count(.//ss:Data) &gt; 0"> 
     <xsl:choose> 
      <xsl:when test="count(.//ss:Data)=1"> 
       <Categorie> 
        <xsl:value-of select=".//ss:Cell[1]/ss:Data"/> 
       </Categorie> 
      </xsl:when> 
      <xsl:when test="count(.//ss:Data)=2"> 
       <Region> 
        <xsl:value-of select=".//ss:Cell[1]/ss:Data"/> 
       </Region> 
      </xsl:when> 
      <xsl:when test="count(.//ss:Data)=3"> 
       <xsl:choose> 
        <xsl:when test=".//ss:Cell[5]/ss:Data='Rating'"> 
         <Header> 
          <Text1> 
           <xsl:value-of select=".//ss:Cell[1]/ss:Data"/> 
          </Text1> 
          <Text2> 
           <xsl:value-of select=".//ss:Cell[3]/ss:Data"/> 
          </Text2> 
          <Text3> 
           <xsl:value-of select=".//ss:Cell[5]/ss:Data"/> 
          </Text3> 
         </Header> 
        </xsl:when> 
        <xsl:otherwise> 
         <Account> 
          <Name> 
           <xsl:value-of select=".//ss:Cell[1]/ss:Data"/> 
          </Name> 
          <Value> 
           <xsl:value-of select=".//ss:Cell[3]/ss:Data"/> 
          </Value> 
          <Rating> 
           <xsl:value-of select=".//ss:Cell[5]/ss:Data"/> 
          </Rating> 
         </Account> 
        </xsl:otherwise> 
       </xsl:choose> 
      </xsl:when> 
      <xsl:when test="count(.//ss:Data)=4"> 
       <xsl:choose> 
        <xsl:when test=".//ss:Cell[5]/ss:Data='Gewicht'"> 
         <Header> 
          <Text1> 
           <xsl:value-of select=".//ss:Cell[1]/ss:Data"/> 
          </Text1> 
          <Text2> 
           <xsl:value-of select=".//ss:Cell[2]/ss:Data"/> 
          </Text2> 
          <Text3> 
           <xsl:value-of select=".//ss:Cell[3]/ss:Data"/> 
          </Text3> 
          <Text4> 
           <xsl:value-of select=".//ss:Cell[5]/ss:Data"/> 
          </Text4> 
         </Header> 
        </xsl:when> 
        <xsl:otherwise> 
         <Account> 
          <Name> 
           <xsl:value-of select=".//ss:Cell[1]/ss:Data"/> 
          </Name> 
          <Type> 
           <xsl:value-of select=".//ss:Cell[2]/ss:Data"/> 
          </Type> 
          <Value> 
           <xsl:value-of select=".//ss:Cell[3]/ss:Data"/> 
          </Value> 
          <Rating> 
           <xsl:value-of select=".//ss:Cell[5]/ss:Data"/> 
          </Rating> 
         </Account> 
        </xsl:otherwise> 
       </xsl:choose> 
      </xsl:when> 
     </xsl:choose> 
    </xsl:if> 
</xsl:template> 

이제이 방법을 찾습니다

<?xml version="1.0" encoding="UTF-8"?> 
<Projects xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"> 
    <Categorie>Categorie 004</Categorie> 
    <Region>AAA</Region> 
    <Account> 
     <Name>AAA</Name> 
     <Value>X</Value> 
     <Rating>0.01</Rating> 
    </Account> 
    <Account> 
     <Name>Name</Name> 
     <Type>Value</Type> 
     <Value>Type</Value> 
     <Rating>Rating</Rating> 
    </Account> 
    <Categorie>Categorie 001</Categorie> 
    <Region>AAA</Region> 
    <Account> 
     <Name>dolor</Name> 
     <Type>123</Type> 
     <Value>A</Value> 
     <Rating>0.01</Rating> 
    </Account> 
    <Account> 
     <Name>sit amet</Name> 
     <Type>445</Type> 
     <Value>B</Value> 
     <Rating>0.03</Rating> 
    </Account> 
    <Account> 
     <Name>consetetur</Name> 
     <Type>36</Type> 
     <Value>B</Value> 
     <Rating>8.0000000000000004E-4</Rating> 
    </Account> 
    <Region>BBB</Region> 
    <Account> 
     <Name>sadipscing</Name> 
     <Type>666</Type> 
     <Value>A</Value> 
     <Rating>0.01</Rating> 
    </Account> 
    <Account> 
     <Name>elitr</Name> 
     <Type>97</Type> 
     <Value>C</Value> 
     <Rating>0.02</Rating> 
    </Account> 
    <Account> 
     <Name>Name</Name> 
     <Type>Value</Type> 
     <Value>Type</Value> 
     <Rating>Rating</Rating> 
    </Account> 
    <Categorie>Categorie 001</Categorie> 
    <Region>AAA</Region> 
    <Account> 
     <Name>aliquyam</Name> 
     <Type>65</Type> 
     <Value>A</Value> 
     <Rating>0.02</Rating> 
    </Account> 
    <Account> 
     <Name>ipsum</Name> 
     <Type>99</Type> 
     <Value>B</Value> 
     <Rating>0.02</Rating> 
    </Account> 
    <Region>BBB</Region> 
    <Account> 
     <Name>lorem</Name> 
     <Type>321</Type> 
     <Value>C</Value> 
     <Rating>0.01</Rating> 
    </Account> 
</Projects> 

나쁜 (나를 위해),하지만 난 할 데이터가 필요 중첩 된 이 방법은 동일한 수준의 모든 데이터가 아닙니다. 당신의 도움이 필요합니다!

<?xml version="1.0" encoding="UTF-8"?> 
<Projects xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"> 
    <Categorie name="001"/> 
     <Region name="AAA"> 
      <Account> 
       <Name>Name</Name> 
       <Type>Value</Type> 
       <Value>Type</Value> 
       <Rating>Rating</Rating> 
      </Account> 
      <Account> 
       <Name>Name</Name> 
       <Type>Value</Type> 
       <Value>Type</Value> 
       <Rating>Rating</Rating> 
      </Account> 
     </Region> 
     <Region name="BBB"> 
      <Account> 
       <Name>Name</Name> 
       <Type>Value</Type> 
       <Value>Type</Value> 
       <Rating>Rating</Rating> 
      </Account> 
      <Account> 
       <Name>Name</Name> 
       <Type>Value</Type> 
       <Value>Type</Value> 
       <Rating>Rating</Rating> 
      </Account> 
      ... 
     </Region> 
     <Categorie name="002"/> 
      <Region name="AAA"> 
       ... 
      </Region> 
     </Categorie> 
</Projects> 

답변

0

는 난 당신이 내가에 대한 테스트의 어떤 종류를 실행하지 않은 당신은 아래의

<xsl:element name="Categorie"> 
     <xsl:attribute name="name"> 
       <xsl:value-of select=".//ss:Cell[1]/ss:Data"/> 
     </xsl:attribute> 
     <xsl:element name="Region"> 
      <xsl:attribute name="name"> 
       <xsl:value-of select=".//ss:Cell[1]/ss:Data"/> 
      </xsl:attribute> 
      //rest of transform here 
     </xsl:element>  
</xsl:element> 

으로 필요 요소/속성은 형식으로 넣어 태그의 일부에 호출을 사용할 필요가 생각 아직,하지만 이것은 필요한 방향으로 당신을 가리켜 야합니다

관련 문제