0

私が持っているとしましょう:

<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>

z の親であるすべてのリスト項目にクラス値を追加したいと考えています。したがって、y を変更したいのですが、x は変更したくありません。

明らかに、これをある種の連想配列に解析してから、逆方向に再帰することができます。テキスト処理(文字列の置換、正規表現など)だけでそれを行う方法はありますか?

ありがとう!

4

8 に答える 8

2

XSLT を使用します。z の祖先であるノードを検索するように指定できます。

于 2008-09-11T15:52:23.363 に答える
2

xpath には、現在のコンテキスト ノードのすべての先祖を含む先祖軸があります。

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

*zの属性idを持つ任意の要素
[@id="z"] (属性は id であるため、そのような要素は 1 つしか存在できません (存在する必要があります)) /ancestor::li 祖先であるすべてのli要素その

参照: https://www.w3schools.com/xml/xpath_axes.asp

于 2008-09-11T16:45:59.613 に答える
1

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>
于 2008-09-12T04:59:59.803 に答える
0

入力ありがとうございます。構文解析(またはxslなどを使用)なしでは不可能だと思いました...まあ。

于 2008-09-11T17:58:15.510 に答える
0

あなたが考えていたように、それを DOM に解析し、逆方向に再帰することをお勧めします。正規表現は、任意のネスト レベルでネストされた構造ではうまく機能しません。

于 2008-09-11T15:51:22.740 に答える
0

jQuery が利用できる場合、これは jQuery に適しています。

$("#z").parent().parent().addClass("foo");
于 2008-09-12T05:34:04.197 に答える
0

「z」の子孫要素を持つ要素にのみ属性を追加します。

于 2008-09-11T17:17:55.293 に答える
0

John Sheehan の anwser に加えて: JQuery では 、実際の構造に依存するよりも
使用したいと思い ます。
$('#z').parents('li').addClass('myClass');

于 2008-09-12T16:49:19.740 に答える