XML和XSLT循环和变量

时间:2013-01-07 17:17:50

标签: xml xslt

这是我的Feed

<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="feedstylev5.xsl"?>
<feed >

   <Layout>
        <breakingnews>
               <story id="112345" rank="1">Story Title 1</story>
                <story id="122345" rank="2">Story Title 1</story>
                <story id="212345" rank="3">Story Title 2</story>

        </breakingnews>

        <topnews>
                <story id="012345" rank="1">Story Title 1</story>
                <story id="117345" rank="2">Story Title 1</story>
                <story id="612345" rank="3">Story Title 1</story>
                <story id="712345" rank="4">Story Title 1</story>

        </topnews>

        <news>
                <story id="012345" rank="1">Story Title 1</story>
                <story id="117345" rank="2">Story Title 1</story>
                <story id="612345" rank="3">Story Title 1</story>
                <story id="312145" rank="4">Story Title 1</story>
                <story id="412045" rank="5">Story Title 1</story>
        </news>

        <sports>
                <story id="712345" rank="1">Story Title 1</story>
                <story id="912345" rank="2">Story Title 1</story>
                <story id="812345" rank="3">Story Title 1</story>
                <story id="102345" rank="4">Story Title 1</story>
                <story id="212245" rank="5">Story Title 1</story>
        </sports>



   </Layout>
</feed>

我想要做的是循环播放故事,突发新闻,体育标签,我想显示标签本身,而不是像下面的硬编码。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:atom="http://www.w3.org/2005/Atom">

<xsl:template match="/feed">
  <html>
  <body>


   <h2 style="font-style:italic; font-weight:bold;">Breaking News</h2>

    <xsl:for-each select="Layout/breakingnews/story">

      <div style="float:left; margin-left:25px; margin-right:5px;"><xsl:value-of select="@rank"/></div>
      <div style="float:left;"> <xsl:value-of select="."/></div>
      <div style="float:left;">(<xsl:value-of select="@id"/>)</div>
      <div style="clear:both;"></div>    
    </xsl:for-each>




  </body>
  </html>
</xsl:template>

</xsl:stylesheet>

我想用变量替换突发新闻,因为值会发生变化并希望让它循环。

2 个答案:

答案 0 :(得分:2)

我的建议是执行以下操作 - 将for-each逻辑移动到模板中:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:atom="http://www.w3.org/2005/Atom">

    <xsl:template match="/feed">
        <html>
            <body>
                <h2 style="font-style:italic; font-weight:bold;">Breaking News</h2>
                <xsl:apply-templates select="Layout/breakingnews/story"/>

                <h2 style="font-style:italic; font-weight:bold;">Top News</h2>
                <xsl:apply-templates select="Layout/topnews/story"/>

            </body>
        </html>
    </xsl:template>

    <xsl:template match="story">
        <div style="float:left; margin-left:25px; margin-right:5px;">
            <xsl:value-of select="@rank"/>
        </div>
        <div style="float:left;">
            <xsl:value-of select="."/>
        </div>
        <div style="float:left;">
            (<xsl:value-of select="@id"/>)
        </div>
        <div style="clear:both;"></div>                
    </xsl:template>

</xsl:stylesheet>

答案 1 :(得分:0)

可以更改XML结构吗?如果是这样,我建议将XML更改为:

<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="feedstylev5.xsl"?>
<feed >

   <Layout>
        <section code="breakingnews" title="Breaking News">
               <story id="112345" rank="1">Story Title 1</story>
                <story id="122345" rank="2">Story Title 1</story>
                <story id="212345" rank="3">Story Title 2</story>

        </section>

        <section code="topnews" title="Top News">
                <story id="012345" rank="1">Story Title 1</story>
                <story id="117345" rank="2">Story Title 1</story>
                <story id="612345" rank="3">Story Title 1</story>
                <story id="712345" rank="4">Story Title 1</story>

        </section>

        ...  

   </Layout>
</feed>

然后像这样制作你的XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:atom="http://www.w3.org/2005/Atom">
  <xsl:template match="/feed">
    <html>
      <body>

        <xsl:apply-templates select="Layout/section" />

      </body>
    </html>
  </xsl:template>

  <xsl:template match="section">
    <h2 style="font-style:italic; font-weight:bold;">
      <xsl:value-of select="@title" />
    </h2>
    <xsl:apply-templates select="story" />
  </xsl:template>

  <xsl:template match="story">
    <div style="float:left; margin-left:25px; margin-right:5px;">
      <xsl:value-of select="@rank"/>
    </div>
    <div style="float:left;">
      <xsl:value-of select="."/>
    </div>
    <div style="float:left;">
      (<xsl:value-of select="@id"/>)
    </div>
    <div style="clear:both;"></div>
  </xsl:template>
</xsl:stylesheet>

上面并没有实际使用code =属性,但我建议将它们用于衡量标准。

如果您无法修改输入XML结构,那么您的下一个最佳选择是将示例中的前两个模板更改为:

  <xsl:template match="/feed">
    <html>
      <body>

         <xsl:call-template name="Section">
           <xsl:with-param name="section" select="Layout/breakingnews" />
           <xsl:with-param name="title" select="'Breaking News'" />
         </xsl:call-template>
         <xsl:call-template name="Section">
           <xsl:with-param name="section" select="Layout/topnews" />
           <xsl:with-param name="title" select="'Top News'" />
         </xsl:call-template>
         <xsl:call-template name="Section">
           <xsl:with-param name="section" select="Layout/news" />
           <xsl:with-param name="title" select="'News'" />
         </xsl:call-template>
         <xsl:call-template name="Section">
           <xsl:with-param name="section" select="Layout/sports" />
           <xsl:with-param name="title" select="'Sports'" />
         </xsl:call-template>

      </body>
    </html>
  </xsl:template>

  <xsl:template name="Section">
    <xsl:param name="section" />
    <xsl:param name="title" />
    <h2 style="font-style:italic; font-weight:bold;">
      <xsl:value-of select="$title" />
    </h2>
    <xsl:apply-templates select="story" />
  </xsl:template>

这将省略任何给定时间内不在Feed中的任何部分,但会要求您对XSL中的标题进行硬编码,并且它们的顺序将被修复。