这个问题的标题可能令人困惑。如果有人对此有正确的术语,请编辑。我有这样一个XML输入文件:
<?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>我想得到一个类似于以下内容的输出:
Name: Joe
Age: 45
Kids:
Boys:
Ramsay
Arthas
Girls:
Eva
Name: Adam
Age: 34
Kids:
Boys:
Jon
Girls:
Jane
Sunita下面是我使用xsl:key编写的XSLT,但是它提供了错误的输出,因为它不能按耐心分组。
<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中。
发布于 2014-02-28 12:23:32
如果您的数据没有唯一的病人id (或者即使有),您可以使用generate()函数来生成一个。我不确定你是否有一个名字(通常,一个名字不能被认为是唯一的),所以试试这个方法:
<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, ' ') "/>
<xsl:value-of select="concat('Age: ', age, ' ') "/>
<xsl:text>Kids: </xsl:text>
<xsl:text>	Boys: </xsl:text>
<xsl:apply-templates select="key('kids-by-gender', concat($pid, 'M')) "/>
<xsl:text>	Girls: </xsl:text>
<xsl:apply-templates select="key('kids-by-gender', concat($pid, 'F')) "/>
<xsl:text> </xsl:text>
</xsl:template>
<xsl:template match="kid">
<xsl:value-of select="concat('		', name, ' ') "/>
</xsl:template>
</xsl:stylesheet>请注意,这需要更多的工作,以适应病人没有任何性别的孩子,或根本没有孩子。
https://stackoverflow.com/questions/22093895
复制相似问题