挑戦のために、私は野生の推測を取り、最初にグループ化すると仮定しますpass
。次にそれぞれの別のpass
の場合は、group
でグループ化します。次に、別のpass
とgroup
の中で、device
でグループ化します。
XSLT 1.0では、通常、グループ化はMuenchian Grouping.という手法で最も効果的です。あなたがグループ化の三つのレベルを持っているとして、あなたは3つのキーが必要です。例として
<xsl:key name="pass" match="StartTest" use="@pass" />
<xsl:key name="passGroup" match="StartTest" use="concat(@pass, '-', @group)" />
<xsl:key name="passGroupDevice" match="StartTest" use="concat(@pass, '-', @group, '-', @device)" />
を、あなたはそうのように、個別のパス値を得るでしょう:
<xsl:apply-templates select="StartTest[generate-id() = generate-id(key('pass', @pass)[1])]" mode="pass" />
を私は与えられたためと仮定しに行きますパス、グループ、デバイスの組み合わせでは、同じ名前のテストを複数回行うことはできません。私はまた、それぞれに対応するEndTest
が続くと仮定しようとしています。すべてのこれらの仮定で
、これは以下のXSLTに
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes" />
<xsl:strip-space elements="*" />
<xsl:key name="pass" match="StartTest" use="@pass" />
<xsl:key name="passGroup" match="StartTest" use="concat(@pass, '-', @group)" />
<xsl:key name="passGroupDevice" match="StartTest" use="concat(@pass, '-', @group, '-', @device)" />
<xsl:template match="Journal">
<Log>
<xsl:apply-templates select="StartTest[generate-id() = generate-id(key('pass', @pass)[1])]" mode="pass" />
</Log>
</xsl:template>
<xsl:template match="StartTest" mode="pass">
<Pass name="{@pass}">
<xsl:apply-templates select="key('pass', @pass)[generate-id() = generate-id(key('passGroup', concat(@pass, '-', @group))[1])]" mode="passGroup" />
</Pass>
</xsl:template>
<xsl:template match="StartTest" mode="passGroup">
<Group name="{@group}">
<xsl:apply-templates select="key('passGroup', concat(@pass, '-', @group))[generate-id() = generate-id(key('passGroupDevice', concat(@pass, '-', @group, '-', @device))[1])]" mode="passGroupDevice" />
</Group>
</xsl:template>
<xsl:template match="StartTest" mode="passGroupDevice">
<Device name="{@device}">
<xsl:apply-templates select="key('passGroupDevice', concat(@pass, '-', @group, '-', @device))"/>
</Device>
</xsl:template>
<xsl:template match="StartTest">
<Test name="{@test}">
<StartTest>
<timestamp><xsl:value-of select="@timestamp" /></timestamp>
</StartTest>
<xsl:apply-templates select="following-sibling::EndTest[1]" />
</Test>
</xsl:template>
<xsl:template match="EndTest">
<EndTest>
<timestamp><xsl:value-of select="@timestamp" /></timestamp>
</EndTest>
<Result>
<xsl:value-of select="@result" />
</Result>
</xsl:template>
</xsl:stylesheet>
注意を与え、私は(字下げだけで激論を避けるために、様々なパス、グループ名とデバイス名ではなく、テキストノードを記録するために属性を使用していますあなたの絶対的な望みの結果を得るには、上記のXSLTのような自動字下げを使用するのではなく、出力の新しい行とスペースをXSLTに追加する必要があります。
XSLTを使用して、その特定の入力をその特定の出力に変換する問題は簡単です。しかし、両親や先祖、世代や鎖に関するあなたの話は、本当の問題はあなたの例よりはるかに複雑であると私は考えています。あなたの問題記述の大部分を明確に理解していないときに、あなたの例のXSLTコードを表示する価値はないと思います。 –
質問を編集して、さらにいくつかの「テスト」と期待される関連出力を含む入力サンプルを表示できますか?それぞれの 'StartTest'と' EndTest'は同じ結果を返します( 'result'とは別に?ありがとう! –