2015-09-14 1 views
0

je l'entrée suivante:template match XSLT valeur clé

<root> 
    <output>   
      <queries> 
       <query name="name1"> 
        <parameters> 
         <parameter name="id_contact">8947</parameter> 
        </parameters> 
        <queryResults/> 
       </query> 
       <query name="name1"> 
        <parameters> 
         <parameter name="id_contact">8943</parameter> 
        </parameters> 
        <queryResults> 
         <record id="1"> 
          <column name="id_task">16422</column> 
          <column name="id_contact">8943</column> 
         </record> 
        </queryResults> 
       </query> 
       <query name="name1"> 
        <parameters> 
         <parameter name="id_contact">1571</parameter> 
        </parameters> 
        <queryResults/> 
       </query> 
      </queries> 
    </output> 
    <output2> 
     <output_getquerydata> 
      <data> 
       <query name="name2"> 
        <parameters> 
         <parameter name="id">1</parameter> 
        </parameters> 
        <queryResults> 
         <record id="1"> 
          <column name="id_task">14016</column> 
          <column name="id_contact">8947</column> 
         </record> 
         <record id="2"> 
          <column name="id_task">14012</column> 
          <column name="id_contact">8943</column> 
         </record> 
         <record id="3"> 
          <column name="id_task">8826</column> 
          <column name="id_contact">1571</column> 
         </record> 
        </queryResults> 
       </query> 
       <output_getquerydata> 
        <queries> 
         <query name="name3"> 
          <parameters> 
           <parameter name="id_task">14016</parameter>        
          </parameters> 
          <queryResults> 
           <record id="1"> 
            <column name="id_shift">2989</column> 
           </record> 
          </queryResults> 
         </query> 
         <query name="name3"> 
          <parameters> 
           <parameter name="id_task">14012</parameter> 
          </parameters> 
          <queryResults/> 
         </query> 
         <query name="name3"> 
          <parameters> 
           <parameter name="id_task">8826</parameter>        
          </parameters> 
          <queryResults/> 
         </query> 
        </queries> 
       </output_getquerydata> 
      </data> 
     </output_getquerydata> 
    </output2> 
</root> 

Mon XSL:

<xsl:strip-space elements="*"/> 
<xsl:key name="k" match="output/queries/query/queryResults/record" use="column[@name='id_contact']"/> 
<xsl:key name="ok" match="output2/output_getquerydata/data/query/queryResults/record" use="column[@name='id_task']"/>  
<!-- identity transform --> 
<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 
<!-- suppress the first output branch --> 
<xsl:template match="output"/> 
<!-- suppress records that have a matching entry in the other branch --> 
<xsl:template match="record[key('k', column[@name='id_contact'])]"/> 
<xsl:template match="parameters[not(key('ok', ./parameter))]"/> 

L'objectif est pour chaque 'query1' qui a queryResults/enregistrement, je prends la valeur de que queryResults/record/column [@ name = 'id_contact'] et supprime chaque enregistrement de "query2" ayant cette valeur dans query2/queryResults/record/column [@ name = 'id_contact']. Cette partie fonctionne, mais la partie suivante ne fonctionne pas comme il se doit: Puis, après que les valeurs de query2 ont été supprimées, prenez les valeurs restantes query2/id_task et conservez la requête [name3] qui a la même valeur dans id_task.

Production Désirée:

<root> 
    <output2> 
     <output_getquerydata> 
      <data> 
       <query name="name2"> 
        <parameters> 
         <parameter name="id">1</parameter> 
        </parameters> 
        <queryResults> 
         <record id="1"> 
          <column name="id_task">14016</column> 
          <column name="id_contact">8947</column> 
         </record> 
         <!--record no.22 deleted, because id_contact=8943 is a match in query1--> 
         <record id="3"> 
          <column name="id_task">8826</column> 
          <column name="id_contact">1571</column> 
         </record> 
        </queryResults> 
       </query> 
       <output_getquerydata> 
        <queries> 
         <query name="name3"> 
          <parameters> 
           <parameter name="id_task">14016</parameter>        
          </parameters> 
          <queryResults> 
           <record id="1"> 
            <column name="id_shift">2989</column> 
           </record> 
          </queryResults> 
         </query> 
         <!--2nd query name3 deleted, because id_task=14012 is not a match in remaining query2 values--> 

         <query name="name3"> 
          <parameters> 
           <parameter name="id_task">8826</parameter>        
          </parameters> 
          <queryResults/> 
         </query> 
        </queries> 
       </output_getquerydata> 
      </data> 
     </output_getquerydata> 
    </output2> 
</root> 

Qu'est-ce que je fais mal? Merci

Répondre

0

Le match de modèle qui ne fonctionne pas est celui-ci ...

<xsl:template match="parameters[not(key('ok', ./parameter))]"/> 

Tout d'abord, vous devez vraiment être le nœud query harmoniser à, comme cela est celui que vous souhaitez supprimer.

Deuxièmement, les modèles correspondent à l'entrée XML, pas à la sortie XML. Vous pouvez supprimer des enregistrements de la sortie, mais l'entrée est inchangée, et c'est ce qui correspondra.

Alors, ce que vous devez faire est de vérifier si la valeur query2 existe ou non, et si elle existe, alors vérifier si cette même valeur va être supprimé (il existe dans query1

Remplacer la Au-dessus du modèle correspond à celui-ci à la place, et voir si cela fait une différence:

<xsl:template match="queries/query 
        [not(key('ok', parameters/parameter)) 
         or key('k', key('ok', parameters/parameter)/column[@name='id_contact'])]"/>