XSLT从XML文件创建表。将多个值放入表';s细胞

XSLT从XML文件创建表。将多个值放入表';s细胞,xml,xslt,html-table,cell,Xml,Xslt,Html Table,Cell,这是学校的一个项目,我大部分时间都在那里。我需要重新创建此PDF文档的左表: 我遇到的问题是在一个单元格中放置多个备用项。它只从XML文件中获取第一个备用元素。以下是我的代码: xsl: 课程登记表 CRN# 课程编号(英语100) 第(0W1)节 标题 信用 交替 总学分 xml: 10000 英语100 0W1 英语简介 3. 10001 历史100 0W2 历史简介 3. 10011 10002 数学100 0W3 代数入门 4. 10012 10022 10003 BSAD 100

这是学校的一个项目,我大部分时间都在那里。我需要重新创建此PDF文档的左表:

我遇到的问题是在一个单元格中放置多个备用项。它只从XML文件中获取第一个备用元素。以下是我的代码:

xsl:


课程登记表
CRN#
课程编号(英语100)
第(0W1)节
标题
信用
交替
总学分
xml:


10000
英语100
0W1
英语简介
3.
10001
历史100
0W2
历史简介
3.
10011
10002
数学100
0W3
代数入门
4.
10012
10022
10003
BSAD 100
0W4
商业介绍
3.
10013
10023
10033
DTD:



我希望它做的是创建表,如果XML文件中有多个备用元素,它将把这些元素与其他备用元素放在同一个单元格中。任何建议或想法都很好

这是因为您使用的是
xsl:value of
。在XSLT1.0中,这只返回第一个匹配项

尝试改用
xsl:apply templates
并为
备选方案添加模板

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" version="4.0" />
    <xsl:template match="/">
        <html>
            <head>
                <title>Course Registration Form</title>
            </head>
            <body>
                <table border="1">
                    <tr>
                        <th>CRN#</th>
                        <th>Course Number (ENGS 100)</th>
                        <th>Section (0W1)</th>
                        <th>Title</th>
                        <th>Credits</th>
                        <th>Alternates</th>
                    </tr>
                    <xsl:for-each select="/schedule/class">
                        <xsl:sort select="crn" />
                        <tr> 
                            <td><xsl:value-of select="crn" /></td>
                            <td><xsl:value-of select="coursenumber" /></td>
                            <td><xsl:value-of select="section" /></td>
                            <td><xsl:value-of select="title" /></td>
                            <td><xsl:value-of select="credits" /></td>
                            <td><xsl:apply-templates select="alternates" /></td>
                        </tr>
                    </xsl:for-each>
                    <tr>
                        <td></td>
                        <td></td>
                        <td></td>
                        <td><b>Total Credits</b></td>
                        <td><xsl:value-of select="sum(/schedule/class/credits)"/></td>
                        <td></td>
                    </tr>
                </table>
            </body>
        </html>
    </xsl:template>

    <xsl:template match="alternates">
        <xsl:if test="not(position()=1)"><br/></xsl:if>
        <xsl:value-of select="."/>
    </xsl:template>
</xsl:stylesheet>

课程登记表
CRN#
课程编号(英语100)
第(0W1)节
标题
信用
交替
总学分


使用
xsl:apply templates
并用其他模板覆盖默认模板(推送方法)将更易于管理和扩展。如果您的样式表复杂得多,您可能需要考虑更新样式表的其余部分。

您的DTD指定零或一个代码>交替< /COD>元素,但是您的XML有多个。这是无效的(浏览器不会告诉你的)。谢谢,伙计,这很好用!我将更多地研究将来使用的模板。
<!DOCTYPE library SYSTEM "schedule.dtd">
<?xml-stylesheet type="text/xsl" href="schedule.xsl" ?>
<schedule>
    <class>
        <crn>10000</crn>
        <coursenumber>ENGS 100</coursenumber>
        <section>0W1</section>
        <title>Intro to English</title>
        <credits>3</credits>
    </class>
    <class>
        <crn>10001</crn>
        <coursenumber>HIST 100</coursenumber>
        <section>0W2</section>
        <title>Intro to History</title>
        <credits>3</credits>
        <alternates>10011</alternates>
    </class>
    <class>
        <crn>10002</crn>
        <coursenumber>MATH 100</coursenumber>
        <section>0W3</section>
        <title>Intro to Algebra</title>
        <credits>4</credits>
        <alternates>10012</alternates>
        <alternates>10022</alternates>
    </class>
    <class>
        <crn>10003</crn>
        <coursenumber>BSAD 100</coursenumber>
        <section>0W4</section>
        <title>Intro to Business</title>
        <credits>3</credits>
        <alternates>10013</alternates>
        <alternates>10023</alternates>
        <alternates>10033</alternates>
    </class>
</schedule>
<!ELEMENT schedule (class+)>
<!ELEMENT class (crn, coursenumber, section, title, credits, alternates?)>
<!ELEMENT crn (#PCDATA)>
<!ELEMENT coursenumber (#PCDATA)>
<!ELEMENT section (#PCDATA)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT credits (#PCDATA)>
<!ELEMENT alternates (#PCDATA)>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" version="4.0" />
    <xsl:template match="/">
        <html>
            <head>
                <title>Course Registration Form</title>
            </head>
            <body>
                <table border="1">
                    <tr>
                        <th>CRN#</th>
                        <th>Course Number (ENGS 100)</th>
                        <th>Section (0W1)</th>
                        <th>Title</th>
                        <th>Credits</th>
                        <th>Alternates</th>
                    </tr>
                    <xsl:for-each select="/schedule/class">
                        <xsl:sort select="crn" />
                        <tr> 
                            <td><xsl:value-of select="crn" /></td>
                            <td><xsl:value-of select="coursenumber" /></td>
                            <td><xsl:value-of select="section" /></td>
                            <td><xsl:value-of select="title" /></td>
                            <td><xsl:value-of select="credits" /></td>
                            <td><xsl:apply-templates select="alternates" /></td>
                        </tr>
                    </xsl:for-each>
                    <tr>
                        <td></td>
                        <td></td>
                        <td></td>
                        <td><b>Total Credits</b></td>
                        <td><xsl:value-of select="sum(/schedule/class/credits)"/></td>
                        <td></td>
                    </tr>
                </table>
            </body>
        </html>
    </xsl:template>

    <xsl:template match="alternates">
        <xsl:if test="not(position()=1)"><br/></xsl:if>
        <xsl:value-of select="."/>
    </xsl:template>
</xsl:stylesheet>