2008-09-11 9 views
0

Sagen, ich habe:Highlight Eltern in XML-Zeichenfolge

<ul> 
    <li id="x"> 
     <a href="x">x</a> 
    </li> 

    <li id="y"> 
     <a href="y">y</a> 

     <ul> 
      <li id="z"> 
       <a href="z">z</a> 
      </li> 
     </ul> 
    </li> 
</ul> 

ich einen Klassenwert an alle Listenelemente hinzufügen möchten, dass die Eltern von z. Also, ich möchte y ändern, aber nicht x.

Offensichtlich kann ich dies in eine Art assoziative Array analysieren und dann rückwärts recurse. Irgendwelche Ideen, wie ich es mit nur Textverarbeitung (String ersetzen, regulären Ausdruck, etc.) tun kann?

Danke!

Antwort

0

Ich schlage vor, Sie analysieren es in ein DOM und recurse rückwärts, wie Sie dachten. Reguläre Ausdrücke funktionieren nicht gut für verschachtelte Strukturen mit beliebigen Verschachtelungsebenen.

2

Ich würde XSLT verwenden. Sie können angeben, dass nach Knoten gesucht wird, die Vorfahren von z sind.

2

xpath hat eine Vorgängerachse, die alle Vorfahren des aktuellen Kontextknotens enthält.

// * [@ id = "z"]/Vorfahr :: li

* jedes Element
[@ id = "z"], die ein Attribut ID mit dem HAS Wert z
/Vorfahr :: li alle li Elemente (da die Attribut-ID kann es (/ sollte nur) ein solches Element sein), dass Vorfahren jenes

sindauch 10

siehe: https://www.w3schools.com/xml/xpath_axes.asp

0

das Attribut hinzufügen, werden nur Elemente mit einem Abkömmling Element von 'z'.

0

Danke für die Eingabe. Ich dachte, es wäre unmöglich ohne zu analysieren (oder mit xsl, etc) ... Na ja.

1

Beispiel für die ganze XSLT:

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

    <xsl:variable name="ancestors" select="descendant::li[@id = 'z']/ancestor::li"/> 

    <xsl:template match="li"> 
    <xsl:copy> 
     <!-- test if current li is in the $ancestors node-list --> 
     <xsl:if test="count($ancestors | .) = count($ancestors)"> 
     <xsl:attribute name="class">ancestor</xsl:attribute> 
     </xsl:if> 
     <xsl:apply-templates select="node() | @*"/> 
    </xsl:copy> 
    </xsl:template> 

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

</xsl:stylesheet> 
1

Dies ist eine gute Passform für jQuery, wenn das für Sie verfügbar ist.

$("#z").parent().parent().addClass("foo"); 
0

Neben John Sheehan anwser:
Mit JQuery würde ich eher
$('#z').parents('li').addClass('myClass');
als sich auf die tatsächliche Struktur verwenden.