2012-10-20 119 views
2

基本上,這是我從莎士比亞的摘錄採取XML玩:XSL的for-each循環

<PLAY> 
<PERSONA>BENEDICK, a young lord of Padua.</PERSONA> 
<PERSONA>LEONATO, governor of Messina.</PERSONA> 
<PERSONA>ANTONIO, his brother.</PERSONA> 
<PERSONA>BALTHASAR, attendant on Don Pedro.</PERSONA> 
<PGROUP> 
    <PERSONA>CONRADE</PERSONA> 
    <PERSONA>BORACHIO</PERSONA> 
    <GRPDESCR>followers of Don John.</GRPDESCR> 
</PGROUP> 
<PERSONA>FRIAR FRANCIS</PERSONA> 
</PLAY> 

這裏的XSL:

<xsl:template match="PLAY"> 
    <html> 
    <body> 
     <xsl:for-each select="PERSONAE"> 

       <xsl:apply-templates select="PERSONA" /> 
       <xsl:apply-templates select="PGROUP/PERSONA" /> 

      </xsl:for-each> 
    </body> 
    </html> 
</xsl:template> 

<xsl:template match="PERSONA"> 
    <p><xsl:value-of select="." /></p> 
</xsl:template> 

<xsl:template match="PGROUP/PERSONA"> 
    <xsl:for-each select="."> 
     <p><xsl:value-of select="." />, </p> 
    </xsl:for-each> 

    <xsl:for-each select=".."> 
     <p><xsl:value-of select="GRPDESCR" /></p> 
    </xsl:for-each> 
</xsl:template> 

目前的HTML輸出:

BENEDICK, a young lord of Padua. 

LEONATO, governor of Messina. 

ANTONIO, his brother. 

BALTHASAR, attendant on Don Pedro. 

FRIAR FRANCIS 

CONRADE, 

followers of Don John. 

BORACHIO, 

followers of Don John. 

這就是我想讓我的HTML輸出看起來像:

BENEDICK, a young lord of Padua. 

LEONATO, governor of Messina. 

ANTONIO, his brother. 

BALTHASAR, attendant on Don Pedro. 

FRIAR FRANCIS 

CONRADE, BORACHIO, followers of Don John. 

我在這個上花了好幾個小時,所以任何幫助都會很棒!

回答

4

在您的XSLT中,您試圖使用xsl:for-each遍歷PERSONAE,但您的示例XML不包含PERSONAE元素。除非有更多的XSLT,你是不是有顯示,你不應該有超過<html> <body></body> </html>

以外的任何輸出,而不是使用xsl:for-each,你可以通過使用利用xsl:apply-templates和「推」風格更簡單地實現所需的輸出特定模板匹配並生成所需的輸出。

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="html"/> 

    <xsl:template match="PLAY"> 
     <html> 
      <body> 
       <!--first, process all PERSONA elements 
        that are children of PLAY--> 
       <xsl:apply-templates select="PERSONA" /> 
       <!--Then, process all PGROUP elements --> 
       <xsl:apply-templates select="PGROUP" /> 
      </body> 
     </html> 
    </xsl:template> 

    <!--generic template match for PERSONA elements --> 
    <xsl:template match="PERSONA"> 
     <p><xsl:value-of select="." /></p> 
    </xsl:template> 

    <!--For each PGROUP matched, create a P and apply templates 
     to child elements(i.e. PERSONA and GRPDESCR) --> 
    <xsl:template match="PGROUP"> 
     <p> 
      <!--Note: No specific template is defined for GRPDESCR. 
       The default XSLT template rules will apply for GRPDESCR 
       and it will copy it's text to output --> 
      <xsl:apply-templates select="*" /> 
     </p> 
    </xsl:template> 

    <!--A more specific match for PERSONA elements that will select the text 
     and then add ", " --> 
    <xsl:template match="PGROUP/PERSONA"> 
     <xsl:value-of select="."/> 
     <xsl:text>, </xsl:text> 
    </xsl:template> 

</xsl:stylesheet> 
+0

你先生,是一個天才。非常感謝! – Encephalon