0

XSLT と Symphony を使用してフォーラムを構築していますが、トピックの返信でメンバーのユーザー名の横に追加のメンバー データ (役割/ランク、アバターなど) を表示するのに問題があります。

では、2 つの XML ドキュメントを示してから、それらをどのように使用しているか、どこで問題が発生しているかを説明します。長く見えますが、全体像を明確にするためです。

トピックへの返信の XML は次のようになります。「Test Topic」というタイトルのトピックへの 2 つの返信を含む例。ここで重要な点は次のauthor/itemとおりです。

<topic-replies>
<section id="10" handle="topic-replies">Topic Replies</section>
    <entry id="66">
        <parent-forum>
            <item id="7" handle="general" section-handle="forums" section-name="Forums">General</item>
        </parent-forum>
        <parent-topic>
            <item id="62" handle="test-topic" section-handle="forum-topics" section-name="Forum Topics">Test Topic</item>
        </parent-topic>
        <body><p>Testing post...</p></body>
        <date-added time="14:44" weekday="4">2012-05-03</date-added>
        <author>
            <item id="1" handle="admin" section-handle="members" section-name="Members">Admin</item>
        </author>
    </entry>
    <entry id="67">
        <parent-forum>
            <item id="7" handle="general" section-handle="forums" section-name="Forums">General</item>
        </parent-forum>
        <parent-topic>
            <item id="62" handle="test-topic" section-handle="forum-topics" section-name="Forum Topics">Test Topic</item>
        </parent-topic>
        <body><p>And here's a reply...?</p></body>
        <date-added time="22:56" weekday="5">2012-05-04</date-added>
        <author>
            <item id="1" handle="test-user-1" section-handle="members" section-name="Members">Test User 1</item>
        </author>
    </entry>
</topic-replies>

これは、登録されたメンバーの XML です。

<user-list>
    <section id="1" handle="members">Members</section>
    <entry id="1">
        <username handle="admin">Admin</username>
        <email>admin@email.com</email>
        <role id="2">
            <name handle="administrator">Administrator</name>
        </role>
    </entry>
    <entry id="2">
        <username handle="test-user-1">Test User 1</username>
        <email>test.user.1@email.com</email>
        <role id="4">
            <name handle="user">User</name>
        </role>
    </entry>
</user-list>

XML に基づいて XSLT をコーディングすると、作成topic-replies者のユーザー名しか取得できません。さらにデータが必要な場合は、から取得する必要がありuser-listます。これは、これらの変数を考慮して、私が行う方法です。

<xsl:variable name="user-list" select="/data/user-list/entry"/>
<xsl:variable name="reply-author" select="/data/topic-replies/entry/author/item"/>

<xsl:template match="topic-replies/entry">
    <ul class="profile">
        <xsl:for-each select="$user-list">
            <xsl:if test="username = $reply-author">
                <li><a class="{role/name/@handle}" href="{$root}/user/{username/@handle}"><xsl:value-of select="username"/></a></li>
                <li><xsl:value-of select="role/name"/></li>
            </xsl:if>
        </xsl:for-each>
    </ul>
</xsl:template>

指定された作成者のみを表示するのではなく、各返信でディスカッションに参加したすべての作成者を取得することを除いて、これは機能します。出力は次のとおりです。

Test Topic

  Testing post...

    Admin
    Administrator

Re: Test Topic

  And here's a reply...?

    Admin
    Administrator
    Test Usuer 1
    User

私の質問は、データをテンプレートから取得しuser-listて挿入するにはどうすればよいですか?topic-replies

キーを使用する必要があるかもしれないと思っていますが、キーを使用するのは初めてで、その背後にあるロジックを本当に考えられません。今のところ、私は本当に手がかりがありません。

前もって感謝します。

4

1 に答える 1

1

これが発生する理由はuser-listreply-author変数にユーザー リストのすべてのエントリとトピック返信のすべての項目が含まれているためです。

リスト内のすべてのユーザーを繰り返す代わりに、アイテムの作成者のユーザー エントリのみを使用してみてください。

<xsl:template match="topic-replies/entry">
    <xsl:variable name="authorEntry" select="$user-list[username/@handle = current()/author/item/@handle]"/>
    <ul class="profile">
        <li>
            <a class="{$authorEntry/role/name/@handle}" href="{$root}/user/{$authorEntry/username/@handle}">
                <xsl:value-of select="$authorEntry/username"/>
            </a>
        </li>
        <li>
            <xsl:value-of select="$authorEntry/role/name"/>
        </li>
    </ul>
</xsl:template>

参照用の完全な例を次に示します。

XML 入力

<data>
    <topic-replies>
        <section id="10" handle="topic-replies">Topic Replies</section>
        <entry id="66">
            <parent-forum>
                <item id="7" handle="general" section-handle="forums" section-name="Forums">General</item>
            </parent-forum>
            <parent-topic>
                <item id="62" handle="test-topic" section-handle="forum-topics" section-name="Forum Topics">Test Topic</item>
            </parent-topic>
            <body><p>Testing post...</p></body>
            <date-added time="14:44" weekday="4">2012-05-03</date-added>
            <author>
                <item id="1" handle="admin" section-handle="members" section-name="Members">Admin</item>
            </author>
        </entry>
        <entry id="67">
            <parent-forum>
                <item id="7" handle="general" section-handle="forums" section-name="Forums">General</item>
            </parent-forum>
            <parent-topic>
                <item id="62" handle="test-topic" section-handle="forum-topics" section-name="Forum Topics">Test Topic</item>
            </parent-topic>
            <body><p>And here's a reply...?</p></body>
            <date-added time="22:56" weekday="5">2012-05-04</date-added>
            <author>
                <item id="1" handle="test-user-1" section-handle="members" section-name="Members">Test User 1</item>
            </author>
        </entry>
    </topic-replies>
    <user-list>
        <section id="1" handle="members">Members</section>
        <entry id="1">
            <username handle="admin">Admin</username>
            <email>admin@email.com</email>
            <role id="2">
                <name handle="administrator">Administrator</name>
            </role>
        </entry>
        <entry id="2">
            <username handle="test-user-1">Test User 1</username>
            <email>test.user.1@email.com</email>
            <role id="4">
                <name handle="user">User</name>
            </role>
        </entry>
    </user-list>    
</data>

XSLT1.0

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:variable name="root" select="'rootVariable'"/>
    <xsl:variable name="user-list" select="/data/user-list/entry"/>

    <xsl:template match="node()|@*">
        <xsl:apply-templates select="node()|@*"/>
    </xsl:template>

    <xsl:template match="/">
        <html>
            <xsl:apply-templates/>
        </html>
    </xsl:template>

    <xsl:template match="topic-replies/entry">
        <xsl:variable name="authorEntry" select="$user-list[username/@handle = current()/author/item/@handle]"/>
        <ul class="profile">
            <li>
                <a class="{$authorEntry/role/name/@handle}" href="{$root}/user/{$authorEntry/username/@handle}">
                    <xsl:value-of select="$authorEntry/username"/>
                </a>
            </li>
            <li>
                <xsl:value-of select="$authorEntry/role/name"/>
            </li>
        </ul>
    </xsl:template>

</xsl:stylesheet>

HTML出力

<html>
   <ul class="profile">
      <li><a class="administrator" href="rootVariable/user/admin">Admin</a></li>
      <li>Administrator</li>
   </ul>
   <ul class="profile">
      <li><a class="user" href="rootVariable/user/test-user-1">Test User 1</a></li>
      <li>User</li>
   </ul>
</html>
于 2012-06-05T02:30:27.133 に答える