我正在尝试检索第一个唯一的2个属性集。
我正在寻找他的第一个独特小组的每个学生姓名。如果学生已经为任何学生选择了第一组,则应列出下一个唯一组。我发布了我的XML和预期结果XML。
我需要XSLT语句来获得此结果(版本1.0)。感谢。
这是我的xml结构
<Socrates>
<Student name='Aristotle' group='1' />
<Student name='Aristotle' group='2' />
<Student name='Aristotle' group='3' />
<Student name='Aristotle' group='4' />
<Student name='Plato' group='1' />
<Student name='Plato' group='2' />
<Student name='Plato' group='3' />
<Student name='Xenophon' group='4' />
<Student name='Xenophon' group='5' />
<Student name='Xenophon' group='6' />
<Student name='Critias' group='1' />
<Student name='Critias' group='2' />
<Student name='Critias' group='3' />
<Student name='Critias' group='4' />
<Student name='Critias' group='5' />
<Student name='Critias' group='6' />
</Socrates>
结果XML
<Socrates>
<Student name='Aristotle' group='1' />
<Student name='Plato' group='2' />
<Student name='Xenophon' group='4' />
<Student name='Critias' group='3' />
</Socrates>
答案 0 :(得分:2)
另一种稍微不同的方法(虽然不一定是更好的方法)是将参数传递给每个学生匹配,其中包含已经包含逗号分隔的组属性已输出。每次匹配学生时,都要检查他们的组是否在他的参数中,如果没有输出学生,则获取下一个,将当前组追加到参数中。
这是XSLT,我已经评论过试图更好地解释事情
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:template match="Socrates">
<Socrates>
<xsl:apply-templates select="Student[1]"/>
</Socrates>
</xsl:template>
<xsl:template match="Student">
<!-- Parameter containin comma-delimited list of currently output groups -->
<xsl:param name="groupList" select="','" />
<xsl:choose>
<!-- Has the group already been output? -->
<xsl:when test="contains($groupList, concat(',', @group, ','))">
<!-- If so, move on to next student record -->
<xsl:apply-templates select="following-sibling::Student[1]">
<xsl:with-param name="groupList" select="$groupList" />
</xsl:apply-templates>
</xsl:when>
<!-- Group has not already been output -->
<xsl:otherwise>
<!-- Output the record -->
<xsl:copy-of select="." />
<!-- Get the next student with a different name -->
<xsl:apply-templates select="following-sibling::Student[@name!=current()/@name][1]">
<xsl:with-param name="groupList" select="concat($groupList, @group, ',')" />
</xsl:apply-templates>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
当应用于您的示例XML时,输出以下内容
<Socrates>
<Student name="Aristotle" group="1" />
<Student name="Plato" group="2" />
<Student name="Xenophon" group="4" />
<Student name="Critias" group="3" />
</Socrates>
请注意,这确实假设学生元素始终按输入XML中的名称排序。