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