两个嵌套for-xml中的循环

时间:2016-02-25 09:13:14

标签: xml xslt xslt-1.0

这是我的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上调用程序模板。

我已经尝试了

  • main / item / program_created
  • item / program_created
  • // program_created

似乎没什么用。

对模板wire_post的调用确实有效。我不知道是什么引起了这种情况。

2 个答案:

答案 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。如果它在模板中永远不会更改,那么您的上下文节点会变得更加清晰。