首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XSLT中的每个父节点分组

XSLT中的每个父节点分组
EN

Stack Overflow用户
提问于 2014-02-28 11:27:36
回答 1查看 117关注 0票数 1

这个问题的标题可能令人困惑。如果有人对此有正确的术语,请编辑。我有这样一个XML输入文件:

代码语言:javascript
复制
    <?xml version="1.0"?>
    <?xml-stylesheet type="text/xsl" href="show.xsl"?>
    <patients>
        <patient>
            <name>Joe</name>
            <age>45</age>
            <kids>
                <kid>
                    <name>Ramsay</name>
                    <gender>M</gender>
                </kid>
                <kid>
                    <name>Eva</name>
                    <gender>F</gender>
                </kid>
                <kid>
                    <name>Arthas</name>
                    <gender>M</gender>
                </kid>
            </kids>
        </patient>
        <patient>
            <name>Adam</name>
            <age>34</age>
            <kids>
                <kid>
                    <name>Jon</name>
                    <gender>M</gender>
                </kid>
                <kid>
                    <name>Jane</name>
                    <gender>F</gender>
                </kid>
                <kid>
                    <name>Sunita</name>
                    <gender>F</gender>
                </kid>
            </kids>
        </patient>
    </patients>

我想得到一个类似于以下内容的输出:

代码语言:javascript
复制
    Name: Joe
    Age: 45
    Kids:
        Boys:
            Ramsay
            Arthas
        Girls:
            Eva
    Name: Adam
    Age: 34
    Kids:
        Boys:
            Jon
        Girls:
            Jane
            Sunita

下面是我使用xsl:key编写的XSLT,但是它提供了错误的输出,因为它不能按耐心分组。

代码语言:javascript
复制
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name="header" match="//kid" use="gender"/>
<xsl:template match="//patients/patient">
        <xsl:value-of select="name"/>
        <xsl:text xml:space="preserve">
        </xsl:text>
        <xsl:value-of select="age"/>
        <xsl:text xml:space="preserve">
        </xsl:text>
        <xsl:text xml:space="preserve">Boys:
            </xsl:text>
        <xsl:for-each select="key('header', 'M')">
            <xsl:value-of select="name"/>
            <xsl:text xml:space="preserve">
            </xsl:text>
        </xsl:for-each>
        <xsl:text xml:space="preserve">
        </xsl:text>        
<xsl:text xml:space="preserve">Girls:
            </xsl:text>
        <xsl:for-each select="key('header', 'F')">
            <xsl:value-of select="name"/>
            <xsl:text xml:space="preserve">
            </xsl:text>
        </xsl:for-each>
</xsl:template>

</xsl:stylesheet>

我正在寻找一个解决方案,最好是在XSLT1.0中。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-28 12:23:32

如果您的数据没有唯一的病人id (或者即使有),您可以使用generate()函数来生成一个。我不确定你是否有一个名字(通常,一个名字不能被认为是唯一的),所以试试这个方法:

代码语言:javascript
复制
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >

<xsl:output method="text" encoding="UTF-8" />
<xsl:strip-space elements="*"/>

<xsl:key name="kids-by-gender" match="kid" use="concat(generate-id(ancestor::patient), gender)"/>

<xsl:template match="patient">
    <xsl:variable name="pid" select="generate-id()" />
    <xsl:value-of select="concat('Name: ', name, '&#10;') "/>
    <xsl:value-of select="concat('Age: ', age, '&#10;') "/>
    <xsl:text>Kids:&#10;</xsl:text>
    <xsl:text>&#9;Boys:&#10;</xsl:text>
    <xsl:apply-templates select="key('kids-by-gender', concat($pid, 'M')) "/>
    <xsl:text>&#9;Girls:&#10;</xsl:text>
    <xsl:apply-templates select="key('kids-by-gender', concat($pid, 'F')) "/>
    <xsl:text>&#10;</xsl:text>
</xsl:template>

<xsl:template match="kid">
    <xsl:value-of select="concat('&#9;&#9;', name, '&#10;') "/>
</xsl:template>
</xsl:stylesheet>

请注意,这需要更多的工作,以适应病人没有任何性别的孩子,或根本没有孩子。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22093895

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档