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

*任何元素
[@id="z"]的属性id的值为z(因为属性是 id,所以只能(/应该)是一个这样的元素)
/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

除了 John Sheehan 的 anwser:
我宁愿使用 JQuery 而
$('#z').parents('li').addClass('myClass');
不是依赖实际结构。

于 2008-09-12T16:49:19.740 回答
0

如果您可以使用 jQuery,这非常适合 jQuery。

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

我建议您将其解析为 DOM 并像您想的那样向后递归。正则表达式不适用于具有任意嵌套级别的嵌套结构。

于 2008-09-11T15:51:22.740 回答
0

只会将该属性添加到具有“z”后代元素的元素。

于 2008-09-11T17:17:55.293 回答
0

感谢您的输入。我认为不解析(或使用 xsl 等)是不可能的......哦,好吧。

于 2008-09-11T17:58:15.510 回答