1

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

输入 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>
4

1 回答 1

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>
于 2012-11-15T04:02:56.907 回答