这是我的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>
我想用变量替换突发新闻,因为值会发生变化并希望让它循环。
答案 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中的标题进行硬编码,并且它们的顺序将被修复。