使用 XSLT 可以防止输出连续的相同值吗? [英] Using XSLT can I prevent output of consecutive identical values?

查看:39
本文介绍了使用 XSLT 可以防止输出连续的相同值吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

是否可以使用 XSL 转换仅匹配 XML 文档中第一次出现的值?

Is it possible to match only the first occurrence of a value in an XML doc using XSL transforms?

我想打印出 f2 中的每个值,但只打印出 f1 内容的第一个实例.

I'd like to print out every value inside f2 but only the first instance of the contents of 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 Grouping 方法:

<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

<小时>

二.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>

这篇关于使用 XSLT 可以防止输出连续的相同值吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆