xslt排序列表并分配唯一编号

时间:2012-11-15 03:20:44

标签: xslt sorting numbers unique assign

XSLT为每个组排序并分配一个唯一的编号:我想在排序后为每个组排序并分配一个唯一的编号。基于<Type>&amp;的排序使用xslt <Location>。请参阅下面的输入和输出预期。

输入XML:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns1:Payload xmlns:ns1="http://abcd.ef.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <ns1:Detail>
        <ns1:ID>141414</ns1:ID>
        <ns1:Type>SS</ns1:Type>
        <ns1:Location>1214</ns1:Location>
    </ns1:Detail>
    <ns1:Detail>
        <ns1:ID>151515</ns1:ID>
        <ns1:Type>MT</ns1:Type>
        <ns1:Location>1215</ns1:Location>
    </ns1:Detail>
    <ns1:Detail>
        <ns1:ID>313131</ns1:ID>
        <ns1:Type>SS</ns1:Type>
        <ns1:Location>1213</ns1:Location>
    </ns1:Detail>
    <ns1:Detail>
        <ns1:ID>123123</ns1:ID>
        <ns1:Type>SS</ns1:Type>
        <ns1:Location>1213</ns1:Location>
    </ns1:Detail>
    <ns1:Detail>
        <ns1:ID>123123</ns1:ID>
        <ns1:Type>MM</ns1:Type>
        <ns1:Location>1213</ns1:Location>
    </ns1:Detail>
    <ns1:Detail>
        <ns1:ID>112233</ns1:ID>
        <ns1:Type>SS</ns1:Type>
        <ns1:Location>1211</ns1:Location>
    </ns1:Detail>
    <ns1:Detail>
        <ns1:ID>112334</ns1:ID>
        <ns1:Type>SS</ns1:Type>
        <ns1:Location>1211</ns1:Location>
    </ns1:Detail>
</ns1:Payload>

输出XML:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns1:Payload xmlns:ns1="http://abcd.ef.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <ns1:Detail>
        <ns1:ID>112233</ns1:ID>
        <ns1:Type>SS</ns1:Type>
        <ns1:Location>1211</ns1:Location>
        <ns1:MsgGroup>1</ns1:MsgGroup>
    </ns1:Detail>
    <ns1:Detail>
        <ns1:ID>112334</ns1:ID>
        <ns1:Type>SS</ns1:Type>
        <ns1:Location>1211</ns1:Location>
        <ns1:MsgGroup>1</ns1:MsgGroup>
    </ns1:Detail>
    <ns1:Detail>
        <ns1:ID>313131</ns1:ID>
        <ns1:Type>SS</ns1:Type>
        <ns1:Location>1213</ns1:Location>
        <ns1:MsgGroup>2</ns1:MsgGroup>
    </ns1:Detail>
    <ns1:Detail>
        <ns1:ID>123123</ns1:ID>
        <ns1:Type>SS</ns1:Type>
        <ns1:Location>1213</ns1:Location>
        <ns1:MsgGroup>2</ns1:MsgGroup>
    </ns1:Detail>
    <ns1:Detail>
        <ns1:ID>123123</ns1:ID>
        <ns1:Type>MM</ns1:Type>
        <ns1:Location>1213</ns1:Location>
        <ns1:MsgGroup>3</ns1:MsgGroup>
    </ns1:Detail>
    <ns1:Detail>
        <ns1:ID>141414</ns1:ID>
        <ns1:Type>MT</ns1:Type>
        <ns1:Location>1214</ns1:Location>
        <ns1:MsgGroup>4</ns1:MsgGroup>
    </ns1:Detail>
    <ns1:Detail>
        <ns1:ID>151515</ns1:ID>
        <ns1:Type>MT</ns1:Type>
        <ns1:Location>1214</ns1:Location>
        <ns1:MsgGroup>4</ns1:MsgGroup>
    </ns1:Detail>
</ns1:Payload>

1 个答案:

答案 0 :(得分:1)

即使您的输入XML与预期输出之间存在不一致,我也会对此进行尝试。 :)你可以告诉我,我生产的是不正确的。

当这个XSLT:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ns1="http://abcd.ef.com" version="1.0">
  <xsl:output omit-xml-declaration="no" indent="yes" />
  <xsl:strip-space elements="*" />

  <xsl:key
    name="kDetail"
    match="ns1:Detail"
    use="concat(ns1:Type, '+', ns1:Location)" />

  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()" />
    </xsl:copy>
  </xsl:template>

  <xsl:template match="/*">
    <xsl:copy>
      <xsl:apply-templates
        select="ns1:Detail[
          generate-id() = 
          generate-id(
            key('
              kDetail',
              concat(ns1:Type, '+', ns1:Location)
            )[1]
          )
        ]">    
        <xsl:sort select="ns1:Location" />
      </xsl:apply-templates>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="ns1:Detail">
    <xsl:variable name="vPos" select="position()" />
    <xsl:for-each select="key('kDetail', concat(ns1:Type, '+', ns1:Location))">
      <xsl:copy>
        <xsl:apply-templates />
        <ns1:MsgGroup>
          <xsl:value-of select="$vPos" />
        </ns1:MsgGroup>
      </xsl:copy>
    </xsl:for-each>
  </xsl:template>

</xsl:stylesheet>

...针对提供的XML运行(已更正我认为,以消除不一致性):

<?xml version="1.0" encoding="UTF-8"?>
<ns1:Payload
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:ns1="http://abcd.ef.com">
  <ns1:Detail>
    <ns1:ID>141414</ns1:ID>
    <ns1:Type>MT</ns1:Type>
    <ns1:Location>1214</ns1:Location>
  </ns1:Detail>
  <ns1:Detail>
    <ns1:ID>151515</ns1:ID>
    <ns1:Type>MT</ns1:Type>
    <ns1:Location>1214</ns1:Location>
  </ns1:Detail>
  <ns1:Detail>
    <ns1:ID>313131</ns1:ID>
    <ns1:Type>SS</ns1:Type>
    <ns1:Location>1213</ns1:Location>
  </ns1:Detail>
  <ns1:Detail>
    <ns1:ID>123123</ns1:ID>
    <ns1:Type>SS</ns1:Type>
    <ns1:Location>1213</ns1:Location>
  </ns1:Detail>
  <ns1:Detail>
    <ns1:ID>123123</ns1:ID>
    <ns1:Type>MM</ns1:Type>
    <ns1:Location>1213</ns1:Location>
  </ns1:Detail>
  <ns1:Detail>
    <ns1:ID>112233</ns1:ID>
    <ns1:Type>SS</ns1:Type>
    <ns1:Location>1211</ns1:Location>
  </ns1:Detail>
  <ns1:Detail>
    <ns1:ID>112334</ns1:ID>
    <ns1:Type>SS</ns1:Type>
    <ns1:Location>1211</ns1:Location>
  </ns1:Detail>
</ns1:Payload>

...想要的结果(我认为)产生了:

<?xml version="1.0"?>
<ns1:Payload
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:ns1="http://abcd.ef.com">
  <ns1:Detail>
    <ns1:ID>112233</ns1:ID>
    <ns1:Type>SS</ns1:Type>
    <ns1:Location>1211</ns1:Location>
    <ns1:MsgGroup>1</ns1:MsgGroup>
  </ns1:Detail>
  <ns1:Detail>
    <ns1:ID>112334</ns1:ID>
    <ns1:Type>SS</ns1:Type>
    <ns1:Location>1211</ns1:Location>
    <ns1:MsgGroup>1</ns1:MsgGroup>
  </ns1:Detail>
  <ns1:Detail>
    <ns1:ID>313131</ns1:ID>
    <ns1:Type>SS</ns1:Type>
    <ns1:Location>1213</ns1:Location>
    <ns1:MsgGroup>2</ns1:MsgGroup>
  </ns1:Detail>
  <ns1:Detail>
    <ns1:ID>123123</ns1:ID>
    <ns1:Type>SS</ns1:Type>
    <ns1:Location>1213</ns1:Location>
    <ns1:MsgGroup>2</ns1:MsgGroup>
  </ns1:Detail>
  <ns1:Detail>
    <ns1:ID>123123</ns1:ID>
    <ns1:Type>MM</ns1:Type>
    <ns1:Location>1213</ns1:Location>
    <ns1:MsgGroup>3</ns1:MsgGroup>
  </ns1:Detail>
  <ns1:Detail>
    <ns1:ID>141414</ns1:ID>
    <ns1:Type>MT</ns1:Type>
    <ns1:Location>1214</ns1:Location>
    <ns1:MsgGroup>4</ns1:MsgGroup>
  </ns1:Detail>
  <ns1:Detail>
    <ns1:ID>151515</ns1:ID>
    <ns1:Type>MT</ns1:Type>
    <ns1:Location>1214</ns1:Location>
    <ns1:MsgGroup>4</ns1:MsgGroup>
  </ns1:Detail>
</ns1:Payload>