有效的xslt条件增量 [英] efficient xslt conditional increment

查看:88
本文介绍了有效的xslt条件增量的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

此问题中,我问如何执行条件增量.提供的答案有效,但不适用于庞大的数据集.

In this question i asked how to perform a conditional increment. The provided answer worked, but does not scale well on huge data-sets.

输入:

<Users>
    <User>
        <id>1</id>
        <username>jack</username>
    </User>
    <User>
        <id>2</id>
        <username>bob</username>
    </User>
    <User>
        <id>3</id>
        <username>bob</username>
    </User>
    <User>
        <id>4</id>
        <username>jack</username>
    </User>
</Users>

所需的输出(最佳时间复杂度):

The desired output (in optimal time-complexity):

<Users>
   <User>
      <id>1</id>
      <username>jack01</username>
   </User>
   <User>
      <id>2</id>
      <username>bob01</username>
   </User>
   <User>
      <id>3</id>
      <username>bob02</username>
   </User>
   <User>
      <id>4</id>
      <username>jack02</username>
   </User>
</Users>

为此,很高兴

  • 按用户名排序输入
  • 每个用户
    • 先前的用户名等于当前的用户名时
      • 增量计数器和
      • 将用户名设置为"$ username $ counter"
      • sort input by username
      • for each user
        • when previous username is equals current username
          • increment counter and
          • set username to '$username$counter'
          • 将计数器设置为1

          有什么想法吗?

          推荐答案

          此转换准确地产生了指定的所需结果,并且效率很高(O(N)):

          <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
           xmlns:ext="http://exslt.org/common" exclude-result-prefixes="ext">
           <xsl:output omit-xml-declaration="yes" indent="yes"/>
           <xsl:strip-space elements="*"/>
          
           <xsl:key name="kUserByName" match="User" use="username"/>
           <xsl:key name="kUByGid" match="u" use="@gid"/>
          
           <xsl:variable name="vOrderedByName">
            <xsl:for-each select=
            "/*/User[generate-id()=generate-id(key('kUserByName',username)[1])]">
               <xsl:for-each select="key('kUserByName',username)">
                 <u gid="{generate-id()}" pos="{position()}"/>
               </xsl:for-each>
            </xsl:for-each>
           </xsl:variable>
          
            <xsl:template match="node()|@*">
               <xsl:copy>
                 <xsl:apply-templates select="node()|@*"/>
               </xsl:copy>
           </xsl:template>
          
           <xsl:template match="username/text()">
               <xsl:value-of select="."/>
               <xsl:variable name="vGid" select="generate-id(../..)"/>
          
               <xsl:for-each select="ext:node-set($vOrderedByName)[1]">
                <xsl:value-of select="format-number(key('kUByGid', $vGid)/@pos, '00')"/>
               </xsl:for-each>
           </xsl:template>
          </xsl:stylesheet>
          

          应用于提供的XML文档:

          <Users>
              <User>
                  <id>1</id>
                  <username>jack</username>
              </User>
              <User>
                  <id>2</id>
                  <username>bob</username>
              </User>
              <User>
                  <id>3</id>
                  <username>bob</username>
              </User>
              <User>
                  <id>4</id>
                  <username>jack</username>
              </User>
          </Users>
          

          产生了所需的正确结果:

          <Users>
             <User>
                <id>1</id>
                <username>jack01</username>
             </User>
             <User>
                <id>2</id>
                <username>bob01</username>
             </User>
             <User>
                <id>3</id>
                <username>bob02</username>
             </User>
             <User>
                <id>4</id>
                <username>jack02</username>
             </User>
          </Users>
          

          这篇关于有效的xslt条件增量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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