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ファイルでも、これらの<INTELLCONT>タグは10〜20個ある可能性があります。内のいくつかのフィールドの最初の5つの値を表示する必要がありますが、タグが「公開済み」に設定されて<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でコードを書く自然な方法であるテンプレートルールについて学ぶ必要があります。

ステータスが公開済みの最初の5つの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 に答える