この変換:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:key name="kwrkTimeByNameTask" match="workTime"
use="concat(../name, '+', @taskID)"/>
<xsl:key name="kDateByName" match="date"
use="../name"/>
<xsl:key name="kwrkTimeByNameTaskDate" match="workTime"
use="concat(../name, '+', @taskID, '+', ../date)"/>
<xsl:template match="/">
<xsl:for-each select=
"*/*/workTime
[generate-id()
=
generate-id(key('kwrkTimeByNameTask',
concat(../name, '+', @taskID)
)[1]
)
]
">
<xsl:sort select="../name"/>
<xsl:sort select="@taskID" data-type="number"/>
<xsl:variable name="vcurTaskId" select="@taskID"/>
<Person>
<name><xsl:value-of select="../name"/></name>
<taskID><xsl:value-of select="@taskID"/></taskID>
<xsl:for-each select=
"key('kDateByName', ../name)
[key('kwrkTimeByNameTaskDate',
concat(../name, '+', current()/@taskID, '+', .)
)
]
">
<workTime>
<date><xsl:value-of select="."/></date>
<time>
<xsl:value-of select=
"key('kwrkTimeByNameTaskDate',
concat(../name, '+', $vcurTaskId, '+', .)
)"/>
</time>
</workTime>
</xsl:for-each>
</Person>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
提供されたXMLに適用した場合(複数の問題から修正されて整形式になります):
<t>
<Person>
<name>John</name>
<date>June12</date>
<workTime taskID="1">34</workTime>
<workTime taskID="1">35</workTime>
<workTime taskID="2">12</workTime>
</Person>
<Person>
<name>John</name>
<date>June13</date>
<workTime taskID="1">21</workTime>
<workTime taskID="2">11</workTime>
<workTime taskID="2">14</workTime>
</Person>
</t>
必要な正しい結果を生成します:
<Person>
<name>John</name>
<taskID>1</taskID>
<workTime>
<date>June12</date>
<time>34</time>
</workTime>
<workTime>
<date>June13</date>
<time>21</time>
</workTime>
</Person>
<Person>
<name>John</name>
<taskID>2</taskID>
<workTime>
<date>June12</date>
<time>12</time>
</workTime>
<workTime>
<date>June13</date>
<time>11</time>
</workTime>
</Person>
説明:
最初にworkTime
../name
@taskID
、グループ化にMuenchianメソッドを使用して、の一意のペアを持つすべての要素を取得します。
これらを../name
と@taskID
-の順に並べ替えます。
そのようなworkTime
date
../name
ものごとに、thisでリストされているすべての要素workTime
を取得し、これらの要素の要素のみを残します。これらのdate
要素にworkTime
は、同じ../date
と。があり../name
ます。
前のステップでは、2つの異なる補助キーを使用します。'kDateByName'
すべてのdate
要素にそれら../name
のインデックスを'kwrkTimeByNameTaskDate'
付け、すべてのworkTime
要素にそれらの../name
、それら、../date
およびそれらのインデックスを付けます@taskID
。
したがって、次の意味:
<xsl:for-each select=
"key('kDateByName', ../name)
[key('kwrkTimeByNameTaskDate',
concat(../name, '+', current()/@taskID, '+', .)
)
]
">
は:
そのためのそれぞれ date
について、その name
ための workTime
、 name
およびdate
( @taskID
外側の電流 の)が存在するように、この命令の本文にあることは何でもします。workTime
<xsl:for-each>
<xsl:for-each>