2016-07-18 9 views
0

私は新しい.xsl/xslt(1.0)を使い、誤ったやり方に取り組んでいると思います。 .xslには実際に使用されている値に関してできるだけ柔軟に対応する必要がありますが、データを評価して必要なレポートを作成することができます。xsl - 子供を両親に変えて

.xml出力の野生生物を飼いならすために、.xslファイルを作成する必要があります。

<Journal> 
    <StartTest timestamp="12:00:00" pass="1" group="A" device="a" test="stretch" /> 
    <EndTest timestamp="12:00:00" pass="1" group="A" device="a" test="stretch" result="Failed" /> 
</Journal> 

私は簡単に十分な要素にこれらを取得することができますが、それはそれの先祖の親としての私の第二の最年少世代で、後方編成されています。これは、属性文字列で私を開始します。 今私は、1つの組織のチェーンに自分のデータをすべてプールしている間に、データの1つのポイント(開始時間と終了時間での合格/不合格)を表すこのビーシーを取得する必要があります(つまり、する必要があるその後、より広範な種類、テストの繰り返し)

<Log> 
    <Pass>1 
     <Group>A 
     <Device>a 
      <Test>Stretch 
       <StartTest> 
        <timestamp>12:00:00</timestamp> 
       </StartTest> 
       <EndTest> 
        <timestamp>12:00:00</timestamp> 
       </EndTest> 
       <Result>Fail</Result> 
      </Test> 
     </Device> 
     </Group> 
    </Pass> 
</Log> 

私は私の知恵の終わりに近づいている、と私はそれが100回のテスト(現在は200個のデータポイントからのデータがあるとして、この出力を自動化する必要がある)によってグループ化逮捕され、カタログ化される。私が言ったように、私は問題を複雑にするかもしれませんが、出力をできるだけ冗長性の少ないものを望む一般人に理解できるようにする必要があります。

何か助けていただければ幸いです。

+0

XSLTを使用して、その特定の入力をその特定の出力に変換する問題は簡単です。しかし、両親や先祖、世代や鎖に関するあなたの話は、本当の問題はあなたの例よりはるかに複雑であると私は考えています。あなたの問題記述の大部分を明確に理解していないときに、あなたの例のXSLTコードを表示する価値はないと思います。 –

+0

質問を編集して、さらにいくつかの「テスト」と期待される関連出力を含む入力サンプルを表示できますか?それぞれの 'StartTest'と' EndTest'は同じ結果を返します( 'result'とは別に?ありがとう! –

答えて

0

挑戦のために、私は野生の推測を取り、最初にグループ化すると仮定しますpass。次にそれぞれの別のpassの場合は、groupでグループ化します。次に、別のpassgroupの中で、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に追加する必要があります。

+0

上記の仮定はすべて正しいです。これはステージ1であるため、属性とは対照的に要素を使用していました。段階2では、各テストの結果が前述のチェーンにグループ化されて書式設定されたレポートに出力されます –

関連する問題