是否可以使用 XSL 转换仅匹配 XML 文档中第一次出现的值?
我想打印出f2 中的每个值,但只打印出 f1 内容的第一个实例。
XML 数据
<doc>
<datum>
<f1>A</f1>
<f2>Monday</f2>
</datum>
<datum>
<f1>A</f1>
<f2>Tuesday</f2>
</datum>
<datum>
<f1>B</f1>
<f2>Wednesday</f2>
</datum>
</doc>
输出
A
-Monday
-Tuesday
B
-Wednesday
I.这是 XSLT 1.0 的众所周知的 Muenchian 分组方法:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:key name="kDatumByF1" match="datum" use="f1"/>
<xsl:template match=
"datum[generate-id() = generate-id(key('kDatumByF1', f1)[1])]">
<xsl:value-of select="concat('
', f1)"/>
<xsl:apply-templates select="key('kDatumByF1', f1)/f2" mode="inGroup"/>
</xsl:template>
<xsl:template match="f2" mode="inGroup">
- <xsl:value-of select="."/>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>
将此转换应用于提供的 XML 文档时:
<doc>
<datum>
<f1>A</f1>
<f2>Monday</f2>
</datum>
<datum>
<f1>A</f1>
<f2>Tuesday</f2>
</datum>
<datum>
<f1>B</f1>
<f2>Wednesday</f2>
</datum>
</doc>
生成所需的正确结果:
A
- Monday
- Tuesday
B
- Wednesday
II. XSLT 2.0 解决方案,使用 xsl:for-each-group
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="/*">
<xsl:for-each-group select="datum" group-by="f1">
<xsl:sequence select="'
', f1"/>
<xsl:apply-templates select="current-group()/f2"/>
</xsl:for-each-group>
</xsl:template>
<xsl:template match="f2">
- <xsl:value-of select="."/>
</xsl:template>
</xsl:stylesheet>