0

这是我的饲料

<?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>

我想用变量替换突发新闻,因为值将发生变化并希望使其循环。

4

2 回答 2

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>
于 2013-01-07T17:25:13.723 回答
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>

这将忽略在任何给定时间不在提要中的任何部分,但会要求您在 XSL 中对标题进行硬编码,并且它们的顺序将是固定的。

于 2013-01-08T04:08:40.087 回答