使用 XSLT 可以防止输出连续的相同值

  • 本文关键字:连续 输出 XSLT 使用 xml xslt
  • 更新时间 :
  • 英文 :


是否可以使用 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('&#xA;', 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="'&#xA;', 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>

最新更新