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 - 我更喜欢使用内联 XSLT 而不是映射器工具,因为我正在转换为期望在俱乐部没有球员的情况下为 nil 属性(在这种情况下只有一个俱乐部,但我也保持这种状态以备将来验证)

这是我尝试过的粗略示例:

    <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 中,您通常希望使用模式匹配来区分不同的情况。在这里,您可以制作两个模板 - 一个用于空俱乐部,另一个用于常规俱乐部。

它很冗长,但一旦你忘记了 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 回答