2013-07-22 2 views
1

Mon requirenament est de supprimer un tag Relation où @guid correspondance avec l'un des @relationObj de relations où <roleCode tc=32> ou <roleCode tc=31> ou <roleCode tc=8> seulement. La logique ci-dessus est également applicable à @relationObj qui doit correspondre à l'un des @relationObj de Relation où <roleCode tc=32> ou <roleCode tc=31> ou <roleCode tc=8> seulement.section Supprimer fondée sur la condition de recherche

Fondamentalement, je veux chercher @guid et @relationObj en recherchant d'autres balises de relation où @relationObj appartient à <roleCode tc=32> ou <roleCode tc=31> ou <roleCode tc=8>. Si cette condition est vraie, supprimez cette section.

est en dessous du XML:

<Relations> 
<Relation guid="abcd1234" relationObj="1234"> 
    <roleCode tc="20"/> 
</Relation> 
<Relation guid="xyz123" relationObj="1111"> 
    <roleCode tc="32"/> 
</Relation> 

<Relation guid="def123" relationObj="2222"> 
    <roleCode tc="31"/> 
</Relation> 

<Relation guid="1111" relationObj="2222"> 
    <roleCode tc="98"/> 
</Relation> 

<Relation guid="jkl123" relationObj="3333"> 
    <roleCode tc="8"/> 
</Relation> 

<Relation guid="2222" relationObj="1234"> 
    <roleCode tc="100"/> 
</Relation> 
</Relations> 

J'ai essayé de créer trois variables pour extraire @relationObj pour chaque <roleCode tc>[32,31 and 8] à l'intérieur du modèle. Et puis en comparant @objectId et @relationObj avec ces trois variables. Mais le problème ici est, la variable est mise à jour à la valeur vide quand elle rencontre une autre étiquette <Relation> en itérant.

De ci-dessus xml je devrais obtenir ci-dessous xml après transformation.

<Relations> 
<Relation guid="abcd1234" relationObj="1234"> 
    <roleCode tc="20"/> 
</Relation> 
<Relation guid="xyz123" relationObj="1111"> 
    <roleCode tc="32"/> 
</Relation> 

<Relation guid="def123" relationObj="2222"> 
    <roleCode tc="31"/> 
</Relation> 
<Relation guid="jkl123" relationObj="3333"> 
    <roleCode tc="8"/> 
</Relation> 
<Relation guid="2222" relationObj="1234"> 
    <roleCode tc="100"/> 
</Relation> 
</Relations> 

Si vous observez, la balise <Relation> avec [guid = "1111" relationObj = "2222"] est supprimé. Parce que @guid et @relationObj appartiennent à l'un des roleCodes - 32,31 ou 8.

Pourriez-vous s'il vous plaît me dire quel est le meilleur pour enregistrer la valeur dans une variable sans mettre à jour avec un nouveau? ou y at-il une meilleure approche que je peux y parvenir. Merci pour votre temps.

Répondre

1

J'aborderions en définissant une clé qui vous permettra d'extraire toutes les valeurs roleCode pour une relationObj, et ensuite utiliser cette touche particulière pour choisir les éléments Relation à exclure. Si je comprends bien vos besoins correctement alors je pense que cela devrait fonctionner:

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

    <xsl:key name="roleCodeByRelObj" match="roleCode" use="../@relationObj" /> 

    <!-- copy input to output except where more specific template applies --> 
    <xsl:template match="@*|node()"> 
    <xsl:copy><xsl:apply-templates select="@*|node()" /></xsl:copy> 
    </xsl:template> 

    <!-- ignore any Relation whose guid and relationObj match the relationObj of a 
     Relation whose roleCode/@tc is 8, 31 or 32 (not necessarily the same 
     matching Relation in both cases) --> 
    <xsl:template match="Relation[ 
     (
     (key('roleCodeByRelObj', @guid)/@tc = '8') or 
     (key('roleCodeByRelObj', @guid)/@tc = '31') or 
     (key('roleCodeByRelObj', @guid)/@tc = '32') 
     ) 
    and 
     (
     (key('roleCodeByRelObj', @relationObj)/@tc = '8') or 
     (key('roleCodeByRelObj', @relationObj)/@tc = '31') or 
     (key('roleCodeByRelObj', @relationObj)/@tc = '32') 
     ) 
    ]" /> 

</xsl:stylesheet> 

La façon dont les tests d'égalité travaillent dans XPath quand un côté est un ensemble de nœuds est que le test est vrai si une des noeuds dans l'ensemble correspondre à la valeur. Ainsi, pour

key('roleCodeByRelObj', @guid)/@tc = '31' 

quand guid est « 2222 » vous obtenez deux éléments roleCode retour de la touche de fonction (tc=31 et tc=98), et le test global réussit parce que l'un d'entre eux correspond à la valeur cible.

+0

Merci pour votre mise à jour. En appliquant xslt ci-dessus, la dernière étiquette de relation [guid = "2222" relationObj = "1234"] ne doit pas être supprimée. Parce que @ relationObj = "1234" appartient au rôleCode 20 qui n'est pas dans la condition. S'il vous plaît voir ma sortie mise à jour xml. –

+0

@MadhuCM Dans votre question initiale, vous avez dit que la relation 2222/1234 devrait être supprimée. Changez-vous maintenant les exigences afin que vous ne souhaitez que supprimer les relations où _both_ la '' guid' _et_ la relationObj' correspondre à un (éventuellement différent) 'Relation/@ relationObj' dont' roleCode' est l'un des trois? –

+0

la dernière relation @ guid = "2222" appartient au rôleCode 31 mais @ relationObj = "1234" n'appartient à aucun des roleCodes (32,31 ou 8). Il devrait donc fondamentalement fonctionner avec ET pour supprimer la section de relation. –

Questions connexes