2016-07-08 7 views
0

複数の親ノードを含むサンプルXMLメッセージがあります。要件は、2つの親ノードが同じで、子ノードをマージする場合のようなものです。XSLT 1.0の照合とマージ

サンプル入力メッセージは、我々は、すべての行のtemperatureCodeの値は、温度のすべての値を(存在する場合)CONCATする必要があり、それらが重複している場合、その子のtemperatureStats内の行をマージ

<document> 
<party> 
    <gtin>1000909090</gtin> 
    <pos> 
     <attrGroupMany name="temperatureInformation"> 
      <row> 
       <attr name="temperatureCode">STORAGE</attr> 
       <attrQualMany name="temperature"> 
        <value qual="FAH">10</value> 
        <value qual="CC">20</value> 
       </attrQualMany> 
       <attrGroupMany name="temperatureStats"> 
        <row> 
         <attr name="StatsCode">CODE1</attr> 
        </row> 
        <row> 
         <attr name="StatsCode">CODE2</attr> 
        </row> 
       </attrGroupMany> 
      </row> 
      <row> 
       <attr name="temperatureCode">STORAGE</attr> 
       <attrQualMany name="temperature"> 
        <value qual="FAH">10</value> 
        <value qual="CC">20</value> 
       </attrQualMany> 
       <attrGroupMany name="temperatureStats"> 
        <row> 
         <attr name="StatsCode">CODE3</attr> 
        </row> 
        <row> 
         <attr name="StatsCode">CODE4</attr> 
        </row> 
       </attrGroupMany> 
      </row> 
      <row> 
       <attr name="temperatureCode">HANDLING</attr> 
       <attrQualMany name="temperature"> 
        <value qual="FAH">10</value>      
       </attrQualMany> 
       <attrGroupMany name="temperatureStats"> 
        <row> 
         <attr name="StatsCode">CODE5</attr> 
        </row> 
        <row> 
         <attr name="StatsCode">CODE6</attr> 
        </row> 
       </attrGroupMany> 
      </row> 
      <row> 
       <attr name="temperatureCode">HANDLING</attr> 
       <attrGroupMany name="temperatureStats"> 
        <row> 
         <attr name="StatsCode">CODE7</attr> 
        </row> 
        <row> 
         <attr name="StatsCode">CODE8</attr> 
        </row> 
       </attrGroupMany> 
      </row> 
     </attrGroupMany> 
    </pos> 
</party> 
</document> 

です親に

予想される出力は同じ構造です。第2ノードが最初にマージされているのが分かります。

<document> 
<party> 
    <gtin>1000909090</gtin> 
    <pos> 
     <attrGroupMany name="temperatureInformation"> 
      <row> 
       <attr name="temperatureCode">STORAGE</attr> 
       <attrQualMany name="temperature"> 
        <value qual="FAH">10</value> 
        <value qual="CC">20</value> 
       </attrQualMany> 
       <attrGroupMany name="temperatureStats"> 
        <row> 
         <attr name="StatsCode">CODE1</attr> 
        </row> 
        <row> 
         <attr name="StatsCode">CODE2</attr> 
        </row> 
        <row> 
         <attr name="StatsCode">CODE3</attr> 
        </row> 
        <row> 
         <attr name="StatsCode">CODE4</attr> 
        </row> 
       </attrGroupMany> 
      </row> 
      <row> 
       <attr name="temperatureCode">HANDLING</attr> 
       <attrQualMany name="temperature"> 
        <value qual="FAH">10</value>      
       </attrQualMany> 
       <attrGroupMany name="temperatureStats"> 
        <row> 
         <attr name="StatsCode">CODE5</attr> 
        </row> 
        <row> 
         <attr name="StatsCode">CODE6</attr> 
        </row> 
       </attrGroupMany> 
      </row> 
      <row> 
       <attr name="temperatureCode">HANDLING</attr> 
       <attrGroupMany name="temperatureStats"> 
        <row> 
         <attr name="StatsCode">CODE7</attr> 
        </row> 
        <row> 
         <attr name="StatsCode">CODE8</attr> 
        </row> 
       </attrGroupMany> 
      </row> 
     </attrGroupMany> 
    </pos> 
</party> 
</document> 

入力は非常に価値があります。

+0

以前の質問と異なるグループが必要ですか?いくつかの要素をマージし、Muenchianのグループ化をキーで使いたい場合、 'key( 'key-name'、someKeyValueExpression)/ attrGroupMany [@name = 'temperatureStats']/row'はあなたが望むすべての' row'要素を与えますマージ。グループ化するためにキーを使用すると、以前の質問で答えられたようです。 –

+0

オプションのノードの扱い方とxml全体を出力する方法を教えてください。私が使用できるコピーコマンドはありますか?サンプルのXSLTを提供する際に助けてもらえれば素晴らしいでしょう。 – Victor

答えて

1

私はあなたが前の回答https://stackoverflow.com/a/38240246/252228にグループへの解決策を持って、あなたは、キーの機能を呼び出すグループ内の項目を処理することができると思う:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 

    <xsl:output indent="yes"/> 


    <xsl:key name="group" match="attrGroupMany[@name = 'temperatureInformation']/row" 
     use="concat(attr[@name = 'temperatureCode'], '|', attrQualMany[@name = 'temperature'])"/> 

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

    <xsl:template match="attrGroupMany[@name = 'temperatureInformation']"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*"/> 
      <xsl:apply-templates select="row[generate-id() = generate-id(key('group', concat(attr[@name = 'temperatureCode'], '|', attrQualMany[@name = 'temperature']))[1])]"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="attrGroupMany[@name = 'temperatureStats']"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | key('group', concat(../attr[@name = 'temperatureCode'], '|', ../attrQualMany[@name = 'temperature']))/attrGroupMany[@name = 'temperatureStats']/row"/> 
     </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

注ただし、文字列値を取るの全体的なアプローチということ子要素が変化する要素の脆弱性がある場合、空白に違いがある場合、値は異なるとみなされる可能性があります。

+0

その作業。ありがとう。この問題は私が取り組もうとしている大きな問題の一部です。このサンプルは確かに役に立ちます。 – Victor

+0

Martin。別の質問のためにあなたの助けが必要です。お手伝いできますありがとう http://stackoverflow.com/questions/38993864/match-and-merge-in-xslt-with-optional-nodes – Victor

関連する問題