2017-04-11 4 views
0

Ich wünsche Element entfernen d und <!-- d --> Kommentar, wenn die Eltern c="string1"XSLT: ein Kind entfernen, wenn ein Elternteil ein Attribut hat

Eingang Attribut haben:

<a> 
<b c="string1"> 
    <!-- d --> 
    <d> 
    <e/> 
    </d> 
    <f/> 
</b> 

<b c="string2"> 
    <!-- d --> 
    <d> 
    <e/> 
    </d> 
    <f/> 
</b> 
</a> 

gewünschte Ausgabe:

<a> 
<b c="string1"> 
    <f/> 
</b> 

<b c="string2"> 
    <!-- d --> 
    <d> 
    <e/> 
    </d> 
    <f/> 
</b> 
</a> 

XSLT:

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

    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/> 

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

    <!-- Those templates do not work --> 
    <xsl:template match="d[???]" /> 
    <xsl:template match="comment()="d" /> 
</xsl:stylesheet> 

Antwort

1

Hier ist eine Art und Weise man es aussehen könnte:

<xsl:template match="b[@c='string1']/d" /> 
<xsl:template match="b[@c='string1']/comment()[.=' d ']" /> 

Oder, wenn Sie bevorzugen:

<xsl:template match="b[@c='string1']"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()[not(self::d or self::comment()[.=' d '])]"/> 
    </xsl:copy> 
</xsl:template> 

Beachten Sie, dass der Wert des Kommentars in dem gegebenen Beispiel ist eigentlich " d " dh das Zeichen "d" umgeben von Leerzeichen.

0

Eine Lösung gefunden. Diese beiden xsl: -Templates funktionieren.

<xsl:template match="d[ancestor::b[@c='string1']]" /> 
<xsl:template match="comment()[contains(.,'d') and ancestor::b[@c='string1']]" /> 

würde ich lieber nicht mit contains(.,'d') sondern eine Gleichheit Ausdruck auf dem Text des Kommentars, aber ich weiß nicht, wie dieser Ausdruck zu schreiben.

+0

Der gewünschte Gleichheitsausdruck wäre '. = 'd' '. Übersehen Sie nicht die Räume auf beiden Seiten des 'd'. –

+0

Außerdem wäre es konventioneller, anstelle von Prädikatausdrücken, die Knoten auf der Vorfahrachse testen, normale Pfadausdrücke zu verwenden. Zum Beispiel, 'match =" b [@ c = 'string1']/d "'. –

Verwandte Themen