我有以下结构:
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而不是映射器工具作为XML我是在俱乐部没有球员的情况下转换为期望零属性(在这种情况下有一个俱乐部,但我也会保留这个以用于未来的校对)
以下是我尝试过的粗略示例:
<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()命令在做什么,我已经离开并改变了很多次我现在无法看到如何纠正它 - 有人可以帮忙吗?
答案 0 :(得分: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>