这是我的xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<main>
<item>
<feed_id>44514</feed_id>
<date_added>2/15/2014 7:01 PM</date_added>
<type_id>20</type_id>
<title>created a new league</title>
<sender>Jordan Bahr</sender>
<recipient>Jordan Bahr</recipient>
<item_content>
<![CDATA[bob]]>
</item_content>
<sender_thumbnail>http://ssl.playerspace.com/assets/images/placeholder.gif</sender_thumbnail>
<sender_profile_url>http://YMCA27McArthur279853.localsportswire.org</sender_profile_url>
<item_content_url/>
<program_created>
<league_id>1228</league_id>
<league_name>McArthur Family YMCA Spring Soccer</league_name>
<league_url>http://mcarthursoccer.localsportswire.org</league_url>
<league_logo>http://content.localsportswire.org/images/default_logos/yorangegreen.png</league_logo>
<league_city>Amelia Island</league_city>
<league_state>FL</league_state>
<league_definition>league</league_definition>
<sport>soccer</sport>
</program_created>
</item>
<item>
<feed_id>44492</feed_id>
<date_added>2/13/2014 4:05 PM</date_added>
<type_id>20</type_id>
<title>created a new league</title>
<sender>Jordan Bahr</sender>
<recipient>Jordan Bahr</recipient>
<item_content>
<![CDATA[bob]]>
</item_content>
<sender_thumbnail>http://ssl.playerspace.com/assets/images/placeholder.gif</sender_thumbnail>
<sender_profile_url>http://YMCA27McArthur279853.localsportswire.org</sender_profile_url>
<item_content_url/>
<program_created>
<league_id>1214</league_id>
<league_name>McArthur Family YMCA Spring Volleyball</league_name>
<league_url>http://MCAvball.localsportswire.org</league_url>
<league_logo>http://master.localsportswire.org/assets/images/subtype1/playerspace/Team Sports/Volleyball.jpg</league_logo>
<league_city>Amelia Island</league_city>
<league_state>FL</league_state>
<league_definition>league</league_definition>
<sport>volleyball</sport>
</program_created>
</item>
</main>
这是我的xslt样式表
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<ul id="feedul">
<xsl:for-each select="main/item">
<li class="item clearfix">
<div class="image">
<a>
<xsl:attribute name="href">
<xsl:value-of select="sender_profile_url"/>
</xsl:attribute>
<img>
<xsl:attribute name="src">
<xsl:value-of select="sender_thumbnail"/>
</xsl:attribute>
<xsl:attribute name="class">img-polaroid img-rounded img-polaroid-table</xsl:attribute>
</img>
</a>
</div>
<div class="info">
<a>
<xsl:attribute name="href">
<xsl:value-of select="sender_profile_url"/>
</xsl:attribute>
<xsl:attribute name="class">name text-info</xsl:attribute>
<xsl:value-of select="sender"/>
</a>
<xsl:text disable-output-escaping="yes"><![CDATA[ ]]></xsl:text>
<a>
<xsl:attribute name="href">
<xsl:value-of select="item_content_url"/>
</xsl:attribute>
<xsl:attribute name="class">name</xsl:attribute>
<xsl:value-of select="title"/>
</a>
<br/>
<p>
<xsl:attribute name="class">title</xsl:attribute>
<span>
<xsl:attribute name="data-id">
<xsl:value-of select="feed_id"/>
</xsl:attribute>
<xsl:attribute name="data-type-id">
<xsl:value-of select="type_id"/>
</xsl:attribute>
<xsl:attribute name="class">
<xsl:if test="type_id=1 or type_id=3 or type_id=21
or type_id=2 or type_id=15">icon-camera</xsl:if>
<xsl:if test="type_id=22"
>icon-comment</xsl:if>
<xsl:if test="type_id=20">icon-bullhorn</xsl:if>
</xsl:attribute>
</span>
Posted on <xsl:text disable-output-escaping="yes"><![CDATA[ ]]></xsl:text>
<xsl:value-of select="date_added"/>
</p>
<!--<xsl:apply-templates/>-->
<xsl:for-each select="main/item/program_created">
<br/><br/><br/><br/>
<xsl:call-template name="programs">
<xsl:with-param name="league_logo" select = "league_logo" />
<xsl:with-param name="league_url" select = "league_url" />
<xsl:with-param name="league_name" select = "league_name" />
<xsl:with-param name="league_city" select = "league_city" />
<xsl:with-param name="league_state" select = "league_state" />
<xsl:with-param name="sport" select = "sport" />
<xsl:with-param name="league_definition" select = "league_definition" />
</xsl:call-template>
</xsl:for-each>
<xsl:call-template name="wire_post">
<xsl:with-param name="item_content" select = "item_content" />
</xsl:call-template>
<br/>
</div>
</li>
</xsl:for-each>
</ul>
</body>
</html>
</xsl:template>
<xsl:template name = "programs" >
<xsl:param name = "league_logo" />
<xsl:param name = "league_url" />
<xsl:param name = "league_name" />
<xsl:param name = "league_city" />
<xsl:param name = "league_state" />
<xsl:param name = "sport" />
<xsl:param name = "league_definition" />
<div>
<xsl:attribute name="class">well well-small clearfix</xsl:attribute>
<a>
<img>
<xsl:attribute name="src">
<xsl:value-of select="@league_logo"/>
</xsl:attribute>
<xsl:attribute name="class">pull-left img-polaroid img-polaroid-table marginright10px</xsl:attribute>
</img>
<xsl:attribute name="href">
<xsl:value-of select="@league_url"/>
</xsl:attribute>
<xsl:attribute name="class">name</xsl:attribute>
<xsl:value-of select="@league_name"/>
</a>
<div></div>
<xsl:value-of select="@league_city"/>,
<xsl:text disable-output-escaping="yes"><![CDATA[ ]]></xsl:text>
<xsl:value-of select="@league_state"/>
<div></div>
A <xsl:value-of select="@sport"/>
<xsl:text disable-output-escaping="yes"><![CDATA[ ]]></xsl:text>
<xsl:value-of select="@league_definition"/>
</div>
</xsl:template>
<xsl:template name = "wire_post" >
<xsl:param name = "item_content" />
<xsl:value-of select="$item_content" disable-output-escaping="yes"/>
</xsl:template>
</xsl:stylesheet>
似乎没有在内部for-each上调用程序模板。
我已经尝试了
似乎没什么用。
对模板wire_post的调用确实有效。我不知道是什么引起了这种情况。
答案 0 :(得分:1)
当您进入for-each循环时,例如:
<xsl:for-each select="main/item">
您将上下文节点切换到所选项目(即main / item),因此如果您编写:
<xsl:for-each select="main/item/program_created">
在你的内部for-each循环中,你基本上是在尝试选择main / item / main / item / program_created。相反,你应该使用:
<xsl:for-each select="program_created">
因此,你的内部for-each循环将选择正确的节点,并且该循环的主体将激活。
答案 1 :(得分:1)
这不是您问题的直接答案,而是一些可能避免其他问题的建议。我通常会发表评论,但这有点大。
您的programs
模板只是偶然“工作” - 您没有使用任何命名参数,参数与$param
一起使用,而不是@param
。但是因为传入了上下文节点,并且该元素上的属性与参数具有相同的名称,所以看起来它正在工作。
您根本不需要为此代码传递参数 - 如果您将<xsl:template name="programs">
替换为<xsl:template match="program_created">
,并删除所有参数,则可以替换调用的<xsl:for-each ..>
它改为使用<xsl:apply-templates select=program_created/>
,您也不需要传递任何参数。您需要做的唯一事情就是将<br/>
移到该模板中。
同样,您可以将wire_post
模板更改为match="item_content"
并使用<xsl:apply-templates select="item_content"/>
代替<xsl:call-template ..>
来调用<xsl:for-each select="items/item">..</xsl:for-each>
模板,并删除所有参数传递。
最后,我建议将<xsl:template match="item">
内的所有内容放在一个单独的模板中,<xsl:apply-templates select="items/item"/>
,然后用__dict__
替换你的for-each。如果它在模板中永远不会更改,那么您的上下文节点会变得更加清晰。