1

私は次の構造を持っています:

League

----Clubs

---------Club

-------------Players

--------------------Player

--------------------------FirstName

--------------------------Surname etc

--------------------Player

--------------------------FirstName

--------------------------Surname etc

---------Club

-------------Players

--------------------Player

--------------------------FirstName

--------------------------Surname etc

--------------------Player

--------------------------FirstName

--------------------------Surname etc

とにかく-xslt変換ですべてのプレーヤーの名前を取得したい(私はBiztalk Mapperを使用しているので、XSLT1に固執する必要があります-変​​換するXMLとして、マッパーツールよりもインラインXSLTを使用することを好みますクラブにプレーヤーがいない状況でのnil属性(この状況では1つのクラブがありますが、将来の保証のためにそれを維持しています)

これが私が試したものの大まかなサンプルです:

    <xsl:template name="PlayerNames">
    <xsl:element name="ns0:PlayersInLeague">
<xsl:element name="ns0:Team>
    <xsl:choose>
    <xsl:when test="current()/*[local-name()='Players']/*[local-name()='Player']">
    <xsl:for-each select="current()/*[local-name()='Players']/*[local-name()='Player']">
        <xsl:element name="ns0:Player"><xsl:value-of select="current()/*[local-name()='FirstName']"/></xsl:element>
    </xsl:for-each>
    </xsl:when>
    <xsl:otherwise>
        <xsl:attribute name="xsi:nil">true</xsl:attribute>
    </xsl:otherwise>
    </xsl:choose>
    </xsl:element>
    </xsl:element>
    </xsl:template>

これらの線に沿った出力が欲しいです:

PlayersInLeague

- - チーム

- - - フレッド

------デビッド

----チームxsi:nil = true

- - チーム

------アレックス

------トム

の入力から

<league>
<clubs>
<club name="London">
<players>
<player>
<firstname>fred</firstname>
</player>
<player>
<firstname>david</firstname>
</player>
</players>
</club>
<club name="Madrid">
<players/>
</club>
<club name="Amsterdam">
<players>
<player>
<firstname>Alex</firstname>
</player>
<player>
<firstname>Tom</firstname>
</player>
</players>
</club>
</clubs>
</league>

current()コマンドが何をしているのか完全にはわかりません。何度も行って変更したので、今は修正する方法がわかりません。誰か助けてもらえますか?

4

1 に答える 1

1

XSLTでは、通常、パターンマッチングを使用してさまざまなケースを区別する必要があります。ここでは、2つのテンプレートを作成できます。1つは空のクラブ用で、もう1つは通常のクラブ用です。

冗長ですが、forループを忘れると、実際には非常に明確になります。

編集:今、私がテンプレートを逆に整理した方が理にかなっていると思います。したがって、スタイルシートを下から上に読んでください。ごめん。;-)

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
    <xsl:template match="player"> <!-- only display firstname contents -->
        <xsl:copy>
            <xsl:apply-templates select="firstname"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="club"> <!-- default club template -->
        <team>
            <xsl:apply-templates/>
        </team>
    </xsl:template>
    <xsl:template match="club[not(players/player)]"> <!-- empty club template -->
        <team>
            <xsl:attribute name="nil" namespace="http://www.w3.org/2001/XMLSchema-instance">true</xsl:attribute>
        </team>
    </xsl:template>
    <xsl:template match="/"> <!-- entry template -->
        <PlayersInLeague>
            <xsl:apply-templates/>
        </PlayersInLeague>
    </xsl:template>
</xsl:stylesheet>
于 2012-08-07T10:16:02.427 に答える