2017-02-21 2 views
0

Ich muss in der Lage sein, einen bestimmten übergeordneten Knoten (und seine untergeordneten) in Abhängigkeit von den Attributen innerhalb des untergeordneten Elements <version> des Absatzes zu entfernen. Im folgenden Beispiel brauche ich XSLT, um die Instanz <version version="ABCD"> zu finden und alles aus dem übergeordneten Element <para0> zu entfernen. Mit anderen Worten versuche ich, bedingte Textfilterung zu erreichen. Das Element, das ich zuordnen muss (und entfernen) wird IMMER das übergeordnete Element von <applic> sein, aber möglicherweise nicht immer ein <para0> wie in dem Beispiel, so dass ich irgendwie angeben muss, dass es dem übergeordneten Element des Elements 'applic' entsprechen muss explizit angeben para0.C# XSLT entfernen Elternknoten basierend auf Attribut von Childnode

Es sollte klarer aus dem Beispiel sein. Ich muss alle para0 Daten mit einem Versionsattribut von ABCD entfernen.

So ist dies eine XML-Beispiel

<root> 
    <para0> 
    <applic> 
     <model> 
     <version version="ABCD"></version> 
     </model> 
    </applic> 
     <subpara1><title>First Title</title> 
      <para>Some text relating to ABCD configuration</para> 
     </subpara1> 
     <subpara1><title>Second Title</title> 
      <para>Some other text and stuff relating to ABCD configuration</para> 
     </subpara1> 
    </para0> 
    <para0> 
    <applic> 
     <model> 
     <version version="TRAINING"></version> 
     </model> 
    </applic> 
     <subpara1><title>First Title</title> 
      <para>Some text relating to TRAINING configuration</para> 
     </subpara1> 
     <subpara1><title>Second Title</title> 
      <para>Some other text and stuff relating to TRAINING configuration</para> 
     </subpara1> 
    </para0> 
</root> 

Hier wird die XSLT-i so weit, aber ich brauche es, einmal zu ABCD abgestimmt, um im Grunde zu wählen und die Eltern von ‚applic‘ löschen und alle Kindknoten.

 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
     <xsl:output method = "xml" indent="yes"/> 
     <xsl:strip-space elements = "*" /> 

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

     <xsl:template match = "//applic/model[@*]/version[@version='ABCD']" /> 

     </xsl:stylesheet> 
+0

Mögliche Duplikat [How to use "und nicht" in XPath?] (Http://stackoverflow.com/questions/1550981/how-to -use-not-in-xpath) –

Antwort

0

Ihre Vorlage "Entfernen" muss mit dem Element übereinstimmen, das Sie entfernen möchten - nicht eines seiner Nachkommen.

Versuchen:

XSLT 1,0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

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

<xsl:template match="*[applic/model/version/@version='ABCD']" /> 

</xsl:stylesheet> 
+0

Vielen Dank, aber es wird nicht immer ein 'para0' sein, mit dem ich übereinstimme. Es kann eine beliebige Anzahl von Elementen sein, denen das "appic" -Tag folgt. Also muss ich ein unbekanntes Element entfernen, nicht spezifisch "para0". –

+0

Ok, wie wäre es jetzt? –

+0

Vielen Dank. –

Verwandte Themen