2012-11-27 51 views
2

以下是我需要转换的原始XML文件。这是一个音乐专辑记录列表,我必须将其转换为HTML表格,并按照发行年份的升序对相册进行排序,并且需要将包含在每个单独记录元素中的流派和唱片标签元素与一个id引用,并将它们输出到表中以及每个专辑。XML到HTML转换与排序

在第二个转换中,我需要做的基本相同,但在这种情况下,输出应该只包含Rock和Pop流派的专辑。

<?xml version="1.0" encoding="utf-8"?> 
<?xml-stylesheet type="text/xsl" href="zadacha1.xsl" ?> 
<record_collection> 
    <genres> 
     <genre id="1">Rock</genre> 
     <genre id="2">Pop</genre> 
     <genre id="3">Disco</genre> 
     <genre id="4">Rap</genre> 
     <genre id="5">Electronic</genre> 
     <genre id="6">Country</genre> 
    </genres> 

    <record_labels> 
     <record_label id="1">DGC Records</record_label> 
     <record_label id="2">Atlantic</record_label> 
     <record_label id="3">Epic</record_label> 
     <record_label id="4">Warner Bros.</record_label> 
     <record_label id="5">EMI</record_label> 
     <record_label id="6">Columbia</record_label> 
    </record_labels> 

    <records> 
     <record> 
      <artist>Nirvana</artist> 
      <genreID>1</genreID> 
      <album>Nevermind</album> 
      <year_of_issue>1992</year_of_issue> 
      <record_labelID>1</record_labelID> 
     </record> 

     <record> 
      <artist>Twisted Sister</artist> 
      <genreID>1</genreID> 
      <album>Stay Hungry</album> 
      <year_of_issue>1984</year_of_issue> 
      <record_labelID>2</record_labelID> 
     </record> 

     <record> 
      <artist>Michael Jackson</artist> 
      <genreID>2</genreID> 
      <album>Thriller</album> 
      <year_of_issue>1982</year_of_issue> 
      <record_labelID>3</record_labelID> 
     </record> 

     <record> 
      <artist>Bee Gees</artist> 
      <genreID>3</genreID> 
      <album>Spirits Having Flown</album> 
      <year_of_issue>1979</year_of_issue> 
      <record_labelID>4</record_labelID> 
     </record> 

     <record> 
      <artist>Ice-T</artist> 
      <genreID>4</genreID> 
      <album>O.G. Original Gangster</album> 
      <year_of_issue>1991</year_of_issue> 
      <record_labelID>4</record_labelID> 
     </record> 

     <record> 
      <artist>Kraftwerk</artist> 
      <genreID>5</genreID> 
      <album>Computer World</album> 
      <year_of_issue>1981</year_of_issue> 
      <record_labelID>5</record_labelID> 
     </record> 

     <record> 
      <artist>Johnny Cash</artist> 
      <genreID>6</genreID> 
      <album>Man in Black</album> 
      <year_of_issue>1971</year_of_issue> 
      <record_labelID>6</record_labelID> 
     </record> 

    </records> 
</record_collection> 

我能管理什么是输出非排序表,而流派和唱片元素,因为它们是在每个人的记录通过ID联系,我不知道如何到达id和输出身份证背后的文字。以下是我现在作为XSLT转换的最新内容。

​​

回答

2

您只需要使用:的

<xsl:apply-templates select="record"> 
    <xsl:sort select="year_of_issue" order="ascending" data-type="number"/> 
</xsl:apply-templates> 

代替

<xsl:apply-templates select="record"/> 

表将在ascendig为了通过发行

+0

非常感谢你! –

1

这是使用xsl:key查找你的风格的好地方,唱片公司

<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:template match="/"> 
     <xsl:apply-templates select="/record_collection/records"></xsl:apply-templates> 
    </xsl:template> 

    <xsl:key name="genre-lookup" match="/record_collection/genres/genre" use="@id"/> 
    <xsl:key name="record_label" match="/record_collection/record_labels/record_label" use="@id"/> 

    <xsl:template match="records"> 
     <html> 
      <head> 
       <title>Records Collection</title> 
      </head> 
      <body> 
       <h1>Records Collection</h1> 
       <table border="1"> 
        <tr> 
         <th>Genre</th> 
         <th>Artist</th> 
         <th>Album</th> 
         <th>Year</th> 
         <th>Label</th> 
        </tr> 

        <xsl:apply-templates select="record" /> 
       </table> 
       <xsl:call-template name="footer" /> 
      </body> 
     </html> 
    </xsl:template> 

    <xsl:template match="record"> 
     <tr> 
      <td> 
       <xsl:value-of select="key('genre-lookup',genreID)" /> 
      </td> 
      <td> 
       <xsl:value-of select="artist" /> 
      </td> 
      <td> 
       <xsl:value-of select="album" /> 
      </td> 
      <td> 
       <xsl:value-of select="year_of_issue" /> 
      </td> 
      <td> 
       <xsl:value-of select="key('record_label',record_labelID)" /> 
      </td> 
     </tr> 
    </xsl:template> 


    <xsl:template name="footer"> 
     <div style="margin: 20px 0; padding: 10px; background-color: #efefef; "> 
      Record Collection 
     </div> 
    </xsl:template> 

</xsl:stylesheet> 

如果你只是想摇滚或流行过滤,然后调整apply-templatesgenreId = 1/2只是筛选:

<xsl:apply-templates select="record[genreID=1 or genreID=2]" /> 

对原始xslt的一个小修改是捕获根目录,以防止默认处理指令bein g应用于文档。

+1

年来排序的帮助好友非常感谢:) !还有一件事 - 转型之后,文件的顶部留下了“流派”和“唱片公司”类别的条目。如何阻止他们在转换后的文档中显示? –

+1

@GrigorPetrov - 这是[默认内置模板]的影响(http://stackoverflow.com/questions/3360017/why-does-xslt-output-all-text-by-default)。添加一个“apply-templates”模板到你感兴趣的节点解决了这个问题(我在我的回答中已经这样做了) – StuartLC

+0

解决了它!凉! –