使用 XSLT 1.0 和 Muenchian 分组方法,如果单个字段的值不变,我如何防止其连续输出 [英] Using XSLT 1.0 and the Muenchian Grouping Method how do I prevent consecutive output of a single field if its value is unchanged

查看:23
本文介绍了使用 XSLT 1.0 和 Muenchian 分组方法,如果单个字段的值不变,我如何防止其连续输出的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这个问题中我问如果可以防止使用 XSLT 输出连续的相同值.在这个问题中,我扩展了输入数据,以便 XSLT 的 Muenchian Grouping method1.0 语法会更清晰.

In this question I asked if it is possible to prevent output of consecutive identical values using XSLT. In this question I extend the input data so that the Muenchian Grouping method for XSLT 1.0 syntax will be clearer.

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

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

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

I'd like to print out every value inside f2,f3 but only the first instance of the contents of f1, retaining order.

XML 数据

    <doc> 
    <datum>
        <f1>One</f1>
        <f2>Monday</f2>
        <f3>January</f3>
      </datum>
      <datum>
        <f1>One</f1>
        <f2>Tuesday</f2>
        <f3>February</f3>
      </datum>
      <datum>
        <f1>Two</f1>
        <f2>Wednesday</f2>
        <f3>March</f3>
    </datum>
    </doc>

输出

      One
      -Monday-January
      -Tuesday-February
      Two
      -Wednesday-March

这是 Dimitre Novatchev 为 XSLT 1.0 提出的解决方案,用于包含字段 f1 和 f2 的输入数据集.

This is the solution that was proposed for XSLT 1.0 by Dimitre Novatchev for an input data set containing the fields f1 and f2.

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

它工作得很好,但我不确定要扩展以在输出中包含字段f3"的语法.

It works quite well but I am unsure of the syntax to extend to include the field 'f3' in the output.

推荐答案

这种转变:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <xsl:output method="text"/>
     <xsl:strip-space elements="*"/>
     <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, '&#xA;')"/>
       <xsl:apply-templates mode="inGroup"
           select="key('kDatumByF1', f1)/*[self::f2 or self::f3]" />
     </xsl:template>

     <xsl:template match="f2|f3" mode="inGroup">
       <xsl:value-of select="concat('- ',., ' ')"/>
       <xsl:if test="not(following-sibling::*[self::f2 or self::f3])">
        <xsl:text>&#xA;</xsl:text>
       </xsl:if>
     </xsl:template>
     <xsl:template match="text()"/>
</xsl:stylesheet>

应用于提供的 XML 文档时:

<doc>
    <datum>
        <f1>One</f1>
        <f2>Monday</f2>
        <f3>January</f3>
    </datum>
    <datum>
        <f1>One</f1>
        <f2>Tuesday</f2>
        <f3>February</f3>
    </datum>
    <datum>
        <f1>Two</f1>
        <f2>Wednesday</f2>
        <f3>March</f3>
    </datum>
</doc>

产生想要的、正确的结果:

One
- Monday - January 
- Tuesday - February 
Two
- Wednesday - March 

说明:

正确使用慕尼黑分组方法.

Proper use of the Muenchian grouping method.

请注意:

即使 f2f3 可以以任何顺序出现,此解决方案也会产生想要的结果.

This solution produces the wanted result even if f2 and f3 can come in any order.

这篇关于使用 XSLT 1.0 和 Muenchian 分组方法,如果单个字段的值不变,我如何防止其连续输出的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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