2017-06-30 24 views
0

XSLT 1.0を使用して異なるレベルで存在する場合、私は、次の入力XMLがありますグループと同じ名前のキーが

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <results> 
     <case> 
     <KEY>c1</KEY> 
     <issue> 
      <KEY>i1</KEY> 
      <id>Apple</id> 
     </issue> 
     <issue> 
      <KEY>i1</KEY> 
      <id>Orange</id> 
     </issue> 
     <issue> 
      <KEY>i2</KEY> 
      <id>Mango</id> 
     </issue> 
     </case> 
     <case> 
     <KEY>c1</KEY> 
     <issue> 
      <KEY>i5</KEY> 
      <id>Apricot</id> 
     </issue> 
     <issue> 
      <KEY>i5</KEY> 
      <id>Blueberry</id> 
     </issue> 
     <issue> 
      <KEY>i6</KEY> 
      <id>blackberry</id> 
     </issue> 
     </case> 
     <case> 
     <KEY>c2</KEY> 
     <issue> 
      <KEY>i3</KEY> 
      <id>Banana</id> 
     </issue> 
     <issue> 
      <KEY>i3</KEY> 
      <id>Cherry</id> 
     </issue> 
     <issue> 
      <KEY>i4</KEY> 
      <id>Grapes</id> 
     </issue> 
     </case> 
    </results> 
</root> 

は、今私は<issue><KEY>によって<KEY>最初と<case>のでグループ化したいが。考え方は、すべての<issue>を問題キーと大文字キーでグループ化することです。最後に、<issue>の中にある<sourceInstance>ノードの下で同じ問題キーを持つ<id>をすべて移動したいと思います。

マイ出力XMLは以下のようにする必要があります:私は、次のXSLTを使って試してみましたが、所望XML出力を得ることができませんでした

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <results> 
     <case> 
     <KEY>c1</KEY> 
     <issue> 
      <KEY>i1</KEY> 
      <sources> 
       <sourceInstance> 
        <id>Apple</id> 
       </sourceInstance> 
       <sourceInstance> 
        <id>Orange</id> 
       </sourceInstance> 
      </sources> 
     </issue> 
     <issue> 
      <KEY>i2</KEY> 
      <sources> 
       <sourceInstance> 
        <id>Mango</id> 
       </sourceInstance> 
      </sources> 
     </issue> 
     <issue> 
      <KEY>i5</KEY> 
      <sources> 
       <sourceInstance> 
        <id>Apricot</id> 
       </sourceInstance> 
       <sourceInstance> 
        <id>Blueberry</id> 
       </sourceInstance> 
      </sources> 
     </issue> 
     <issue> 
      <KEY>i6</KEY> 
      <sources> 
       <sourceInstance> 
        <id>Apple</id> 
       </sourceInstance> 
       <sourceInstance> 
        <id>Orange</id> 
       </sourceInstance> 
      </sources> 
     </issue> 
     </case> 
     <case> 
     <KEY>c2</KEY> 
     <issue> 
      <KEY>i3</KEY> 
      <sources> 
       <sourceInstance> 
        <id>Banana</id> 
       </sourceInstance> 
       <sourceInstance> 
        <id>Cherry</id> 
       </sourceInstance> 
      </sources> 
     </issue> 
     <issue> 
      <KEY>i4</KEY> 
      <sources> 
       <sourceInstance> 
        <id>Grapes</id> 
       </sourceInstance> 
      </sources> 
     </issue> 
     </case> 
    </results> 
</root> 

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="xml" indent="yes" /> 
    <xsl:key name="case" match="case" use="string(KEY)" /> 
    <xsl:key name="issue" match="case" use="concat(KEY, '|', KEY)" /> 
    <xsl:template match="results"> 
     <xsl:copy> 
     <xsl:apply-templates select="case[generate-id() = generate-id(key('case', string(KEY))[1])]" mode="case" /> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="case" mode="case"> 
     <xsl:choose> 
     <xsl:when test="KEY"> 
      <case> 
       <xsl:copy-of select="KEY" /> 
       <xsl:apply-templates select="key('case', KEY)[generate-id() = generate-id(key('issue', concat(KEY, '|', KEY))[1])]" mode="issue" /> 
      </case> 
     </xsl:when> 
     </xsl:choose> 
    </xsl:template> 
    <xsl:template match="case " mode="issue"> 
     <xsl:choose> 
     <xsl:when test="KEY"> 
      <issue> 
       <xsl:copy-of select="KEY" /> 
       <sources> 
        <xsl:apply-templates select="key('issue', id)" /> 
       </sources> 
      </issue> 
     </xsl:when> 
     </xsl:choose> 
    </xsl:template> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
     <xsl:apply-templates select="@*|node()" /> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="case"> 
     <sourceInstance> 
     <id> 
      <xsl:value-of select="id" /> 
     </id> 
     </sourceInstance> 
    </xsl:template> 
</xsl:stylesheet> 

私は同じ名前(すなわち<KEY>)を持つノードが両方の場所に存在するとして<case><issue><KEY>を使用してキーの正しい組み合わせをフレームすることができませんと思われます。

私のXSLTに何が欠けているか教えていただけますか?

答えて

2

主な問題は、あなたがここにissue要素を照合し、issueのためのKEYの連結と親を使用している必要がありissue

<xsl:key name="issue" match="case" use="concat(KEY, '|', KEY)" /> 

のあなたの鍵の定義case要素である

<xsl:key name="issue" match="issue" use="concat(KEY, '|', ../KEY)" /> 

次に、case KEYのグループ化されたissue要素を取得するには、これを実行します。

<xsl:apply-templates select="key('case', KEY)/issue[generate-id() = generate-id(key('issue', concat(KEY, '|', ../KEY))[1])]" mode="issue" /> 

最適です。このXSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="xml" indent="yes" /> 
    <xsl:key name="case" match="case" use="string(KEY)" /> 
    <xsl:key name="issue" match="issue" use="concat(KEY, '|', ../KEY)" /> 

    <xsl:template match="results"> 
     <xsl:copy> 
     <xsl:apply-templates select="case[generate-id() = generate-id(key('case', string(KEY))[1])]" mode="case" /> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="case" mode="case"> 
     <xsl:choose> 
     <xsl:when test="KEY"> 
      <case> 
       <xsl:copy-of select="KEY" /> 
       <xsl:apply-templates select="key('case', KEY)/issue[generate-id() = generate-id(key('issue', concat(KEY, '|', ../KEY))[1])]" mode="issue" /> 
      </case> 
     </xsl:when> 
     </xsl:choose> 
    </xsl:template> 

    <xsl:template match="issue" mode="issue"> 
     <xsl:choose> 
     <xsl:when test="KEY"> 
      <issue> 
       <xsl:copy-of select="KEY" /> 
       <sources> 
        <xsl:apply-templates select="key('issue', concat(KEY, '|', ../KEY))" /> 
       </sources> 
      </issue> 
     </xsl:when> 
     </xsl:choose> 
    </xsl:template> 

    <xsl:template match="@*|node()"> 
     <xsl:copy> 
     <xsl:apply-templates select="@*|node()" /> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="issue"> 
     <sourceInstance> 
     <id> 
      <xsl:value-of select="id" /> 
     </id> 
     </sourceInstance> 
    </xsl:template> 
</xsl:stylesheet> 
+0

をお試しください!あなたの迅速な対応のために+1。 –