2

Basically this is my XML taken from an excerpt of a Shakespeare play:

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

Here's the 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>

The current HTML output:

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.

And this is what I want my HTML output to look like:

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.

I've spent hours on this so any help would be so great!

4

1 回答 1

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>
于 2012-10-20T23:41:25.913 回答