Xslt 孙子节点的存在及其值的迭代

Xslt 孙子节点的存在及其值的迭代,xslt,xslt-1.0,Xslt,Xslt 1.0,我的结构如下: League ----Clubs ---------Club -------------Players --------------------Player --------------------------FirstName --------------------------Surname etc --------------------Player --------------------------FirstName -----------------

我的结构如下:

League

----Clubs

---------Club

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

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

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

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

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

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

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

---------Club

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

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

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

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

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

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

--------------------------Surname etc
无论如何,我希望在xslt转换中获得所有参与者的姓名(我使用的是Biztalk映射器,因此必须坚持使用XSLT1-我更喜欢使用内联xslt,而不是映射器工具,因为我转换到的XML在俱乐部没有参与者的情况下需要一个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>


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

这是冗长的,但一旦你忘记了for循环,它实际上是非常清楚的

编辑:现在,如果我将模板反向组织,我会觉得更有意义。因此,请从头到尾阅读样式表。对不起。;-)


真的

在XSLT中,您通常希望使用模式匹配来区分不同的情况。在这里,您可以创建两个模板—一个用于空俱乐部,另一个用于常规俱乐部

这是冗长的,但一旦你忘记了for循环,它实际上是非常清楚的

编辑:现在,如果我将模板反向组织,我会觉得更有意义。因此,请从头到尾阅读样式表。对不起。;-)


真的

谢谢!然而,我所困惑的是,这是怎么知道我想要弗雷德的呢?或者我必须添加一个单独的模板吗?从未真正处理过太多模板等默认情况下将包括在firstname元素(但没有元素)下找到的所有文本。的副本应按原样复制整个子树。XSLT基于模板。当引擎遍历输入XML时(当它们与当前节点匹配时),将应用它们。因此,真正控制执行的是输入文档。谢谢:)工作(一旦我在模板中添加了名称):)谢谢!然而,我所困惑的是,这是怎么知道我想要弗雷德的呢?或者我必须添加一个单独的模板吗?从未真正处理过太多模板等默认情况下将包括在firstname元素(但没有元素)下找到的所有文本。的副本应按原样复制整个子树。XSLT基于模板。当引擎遍历输入XML时(当它们与当前节点匹配时),将应用它们。因此,真正控制执行的是输入文档。谢谢:)工作正常(一旦我将名称添加到模板中):)
<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>
<?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>