Как (двухуровневая) группировка Meunchian из основанного на атрибутах плоского XML - PullRequest
0 голосов
/ 28 июня 2011

Я разместил вопрос на этом форуме на прошлой неделе и получил очень хороший ответ, но я понял, что недостаточно углубился, поэтому, после еще одной недели бесплодных поисков, я надеюсь, что смогу найти здесь какую-то помощь .

Начинающий - преобразование XML в XML с использованием XSLT

Теперь у меня есть таблица стилей XSL, которая преобразует сгенерированный PHP XML в форму, которая читается как список воспроизведения для видеопроигрывателя. По сути, это преобразует плоскую структуру в одну с двумя уровнями иерархии (пользователь -> спорт).

Ранее я забыл упомянуть, что мне нужен третий уровень иерархии (пользователь -> спорт -> videoID), чтобы я мог прикреплять атрибуты видео к каждому видео.

Оригинальный XML

   <?xml version="1.0" ?>  
<CONTENT>   
<GALLERY name="John" vid="1" vidtitle="NL - 22nd Jan 2011 - FO sport="Soccer" />       
<GALLERY name="John" vid="2" vidtitle="NL - 22nd Jan 2011 - DL" sport="Golf" />
<GALLERY name="sportshound" vid="28" vidtitle="Tiger Woods" sport="Golf" />    
<GALLERY name="sportshound" vid="29" vidtitle="Tigerwoodstest" sport="Golf" />    
<GALLERY name="John" vid="36" vidtitle="5 iron behind April" sport="Golf" />    
<GALLERY name="John" vid="35" vidtitle="face on april" sport="Golf" />    
<GALLERY name="John" vid="34" vidtitle="wqetfgtgdijuserf" sport="Golf" />    
<GALLERY name="John" vid="37" vidtitle="April - 3 iron Behind" sport="Golf" />    
<GALLERY name="John" vid="38" vidtitle="April - 7 iron behind" sport="Golf" />    
<GALLERY name="John" vid="39" vidtitle="April - 3 wood behind" sport="Golf" />    
<GALLERY name="John" vid="40" vidtitle="24 April - 7 iron behind" sport="Golf" />    <GALLERY name="John" vid="41" vidtitle="April 29 Iron behind swing left" sport="Golf" />    
<GALLERY name="John" vid="42" vidtitle="29 April iron behind shallowing" sport="Golf" />    
<GALLERY name="John" vid="43" vidtitle="1st May Driver Behind" sport="Golf" />    
<GALLERY name="John" vid="44" vidtitle="21st May - 6I behind - swing left" sport="Golf" />    
<GALLERY name="John" vid="45" vidtitle="Adam Scott - Masters '11 - iron behind" sport="Golf" />    
<GALLERY name="John" vid="46" vidtitle="19th June 2011 - Face on - impact" sport="Golf" />    
<GALLERY name="John" vid="47" vidtitle="19 June - Behind - 6i" sport="Golf" />    
<GALLERY name="John" vid="48" vidtitle="19 June 2011 - Face on - 8i (impact)" sport="Golf" />    
<GALLERY name="John" vid="49" vidtitle="19 June 2011 - Face On - 5i (impact)" sport="Golf" />    
</CONTENT> 

Предлагаемая структура

<CONTENT>   
  <GALLERY name="John">     
   <CATEGORY sport="Soccer">       
     <ITEM>          
      <vid>1</vid>   
      <vidtitle>NL - 22nd Jan 2011 - FO</vidtitle>
     </ITEM>     
   </CATEGORY>     
   <CATEGORY sport="Golf">       
     <ITEM>         
       <vid>2</vid>         
       <vidtitle>NL - 22nd Jan 2011 - DL</vidtitle>
     </ITEM>
     <ITEM>
       <vid>36</vid>   
       <vidtitle>NL - 22nd Jan 2011 - DL</vidtitle>
     </ITEM>
    ............      
   </CATEGORY>   
  <GALLERY/>   
  <GALLERY name="sportshound">     
   <CATEGORY sport="Golf">       
    <ITEM>         
      <vid>28</vid>         
      <vidtitle>Tigerwoodstest</vid>       
    </ITEM>     
     .........
   </CATEGORY>   
  <GALLERY/> 
</CONTENT> 

Текущая таблица стилей XSL

    <xsl:stylesheet   
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"   
version="1.0">    
<xsl:output indent="yes"/>    
<xsl:key name="k1" match="GALLERY" use="@name"/>   
<xsl:key name="k2" match="GALLERY" use="concat(@name, '|', @sport)"/>    
<xsl:template match="CONTENT">     
<xsl:copy>       
<xsl:apply-templates select="GALLERY[generate-id() = generate-id(key('k1', @name)[1])]"/>     
</xsl:copy>   
</xsl:template>    
<xsl:template match="GALLERY">     
<GALLERY name="{@name}">       
<xsl:apply-templates select="key('k1', @name)[generate-id() = generate-id(key('k2', concat(@name, '|', @sport))[1])]" mode="sport"/>     
</GALLERY>   
</xsl:template>    
<xsl:template match="GALLERY" mode="sport">     
<CATEGORY sport="{@sport}">       
<ITEM>         
<xsl:apply-templates select="key('k2', concat(@name, '|', @sport))/@vid"/>       </ITEM>     
</CATEGORY>   
</xsl:template>    
<xsl:template match="GALLERY/@vid">     
<vid>       
<xsl:value-of select="."/>     
</vid>   
</xsl:template>  
</xsl:stylesheet> 

1 Ответ

0 голосов
/ 30 июня 2011

На самом деле вам не нужна третья группировка, просто оберните элементы третьего уровня по-другому.

В вашем преобразовании вам необходимо заменить:

<xsl:template match="GALLERY" mode="sport">     
    <CATEGORY sport="{@sport}">       
        <ITEM>         
            <xsl:apply-templates select="
              key('k2', concat(@name, '|', @sport))/@vid"/>      
        </ITEM>     
    </CATEGORY>   
</xsl:template>    

<xsl:template match="GALLERY/@vid">     
    <vid>       
        <xsl:value-of select="."/>     
    </vid>   
</xsl:template>  

на:

    <xsl:template match="GALLERY" mode="sport">     
        <CATEGORY sport="{@sport}">          
            <xsl:apply-templates select="
              key('k2', concat(@name, '|', @sport))" 
              mode="item"/> 
        </CATEGORY>   
    </xsl:template>    

    <xsl:template match="GALLERY" mode="item"> 
        <ITEM>
            <vid>       
                <xsl:value-of select="@vid"/>     
            </vid>
            <vidtitle>
                <xsl:value-of select="@vidtitle"/>
            </vidtitle>
        </ITEM>     
    </xsl:template>  

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...