2016-07-11 10 views
0

以下のXSLTは、単一ノード 'pos'を持つと重複ノードを削除しますが、複数の 'pos'ノードがある場合は機能しません。XSLT 1.0を複数のノードにマッチさせてマージする

ノード「pos」内のデータは、他の「pos」ノードのデータに関して重複を除去するために、独立して処理されなければならない。ノード 'pos'内のデータは互いに独立しています。 以下のXSLTを使用する場合、両方の 'pos'ノードのデータをマージして重複を削除しています。 任意の入力は大きな助けになるだろう

サンプルメッセージは

<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> 
     <pos> 
      <attrGroupMany name="temperatureInformation"> 
       <row> 
        <attr name="temperatureCode">STORAGE1</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> 

である私は、ここで使用しているXSLTが期待される出力が

<?xml version="1.0" encoding="UTF-8"?> 
    <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> 
     <pos> 
      <attrGroupMany name="temperatureInformation"> 
       <row> 
        <attr name="temperatureCode">STORAGE1</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> 

どれ入力され

<?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

以下では、XSLTはノード内の重複を削除します。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
version="1.0"> 



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

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

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

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

</xsl:stylesheet> 
関連する問題