0

我一直用这个把头撞在墙上。我有一系列这样的 XML:

    <INTELLCONT id="33954082817" dmd:lastModified="2011-04-05T13:38:05" dmd:startDate="2010-12-30" dmd:endDate="2010-12-30">
        <CONTYPE>Journal Article</CONTYPE>
        <CONTYPEOTHER/>
        <CLASSIFICATION>Learning and Pedagogical Research</CLASSIFICATION>
        <STATUS>Not Accepted</STATUS>
        <TITLE>The Use of Alternative Quiz Formats to Enhance Students’ Experiences in the Introductory Accounting Course</TITLE>

    </INTELLCONT>
    <INTELLCONT id="11473068032" dmd:lastModified="2012-08-30T14:12:05" dmd:startDate="2009-03-17" dmd:endDate="2010-11-30">
        <CONTYPE>Journal Article</CONTYPE>
        <CONTYPEOTHER/>
        <CLASSIFICATION>Learning and Pedagogical Research</CLASSIFICATION>
        <STATUS>Published</STATUS>
        <TITLE>"Using Debate to Enhance Critical Thinking in the Accounting Classroom: Two Examples of Debates on the Sarbanes-Oxley Act and Tax Policy Issues</TITLE>

(为简洁起见,我删除了其他一些标签)。对于任何 xml 文件,可能有 10-20 个这些<INTELLCONT>标签。我需要显示 中某些字段的前五个字段的值<INTELLCONT>,但仅显示<PUBLISH>标记设置为“已发布”的条目。这是到目前为止的xsl:

    <xsl:choose>
    <xsl:when test="dm:Data/dm:Record/dm:INTELLCONT/dm:STATUS = 'Published'">
        <xsl:for-each select="dm:Data/dm:Record/dm:INTELLCONT[1]">
            <xsl:if test="dm:STATUS = 'Published'">
                <p><xsl:value-of select="dm:TITLE" />, 
                    <xsl:choose>
                        <xsl:when test="dm:JOURNAL/dm:JOURNAL_NAME !=''">
                            <i><xsl:value-of select="dm:JOURNAL/dm:JOURNAL_NAME"/></i>, 
                        </xsl:when>
                        <xsl:otherwise>
                            <xsl:text> </xsl:text>
                        </xsl:otherwise>
                    </xsl:choose>
                    <xsl:choose>
                        <xsl:when test="dm:DTM_PUB !=''">
                            <xsl:value-of select="dm:DTM_PUB"/>,
                        </xsl:when>
                        <xsl:otherwise>
                           <xsl:text> </xsl:text>
                       </xsl:otherwise>
                   </xsl:choose>
                    <xsl:value-of select="dm:DTY_PUB"/></p>
            </xsl:if>
        </xsl:for-each>
    </xsl:when>
</xsl:choose>

这将显示第一个条目,但前提是<STATUS> 设置为“已发布”。这很好,但就像在上面的 xml 中一样,因为<STATUS>不是“已发布”,所以什么都没有显示。这也很好,但如果我把这段代码放进去,然后把这一行列举<xsl:for-each select="dm:Data/dm:Record/dm:INTELLCONT[1]">出来,<xsl:for-each select="dm:Data/dm:Record/dm:INTELLCONT[5]">我会得到所有发布的条目<STATUS>,但如果发布的条目少于 5 个,那么我不会得到我需要的 5 个条目的列表。

我知道必须有更好的方法来做到这一点,但我还没有想出来。任何帮助都会很棒!

4

1 回答 1

4

我不完全理解您对要求的解释,但您似乎以完全错误的方式进行。您需要了解模板规则,这是在 XSLT 中编写代码的自然方式!

如果要显示 STATUS 为 Published 的前五个 INTELLCONT 元素,请使用

<xsl:apply-templates select="dm:INTELLICONT[dm:STATUS='Published'][position() &lt;= 5]"/>

然后编写一个模板规则来显示它们:

<xsl:template match=:dm:INTELLICONT">
 <p><xsl:apply-templates/></p>
</xsl:template>

然后为各个字段编写模板规则:

<xsl:template match="dm:JOURNAL[dm:JOURNAL_NAME != '']">
  <i><xsl:value-of select="dm:JOURNAL_NAME"/></i>
</xsl:template>

当您看到专家编写的 XSLT 代码时,您会发现很少有 for-each、choose 或 if 指令。

于 2012-10-23T20:37:02.363 回答