Выделите родителей в строке XML - PullRequest
0 голосов
/ 11 сентября 2008

Скажи, что у меня есть:

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

Очевидно, я могу разобрать это в некоторый ассоциативный массив и затем вернуться назад. Любые идеи, как я могу сделать это с помощью простой обработки текста (замена строк, регулярное выражение и т. Д.)?

Спасибо!

Ответы [ 8 ]

2 голосов
/ 11 сентября 2008

xpath имеет ось предков, которая включает в себя всех предков текущего узла контекста.

// * [@ ид = "г"] / предком :: Li

* любой элемент
[@ id = "z"] с атрибутом id со значением z (поскольку атрибут является идентификатором, можно (/ должно быть) только один такой элемент)
/ ancestor :: li все li элементы, которые являются предками этого

см. Также: https://www.w3schools.com/xml/xpath_axes.asp

2 голосов
/ 11 сентября 2008

Я бы использовал XSLT. Вы можете указать для поиска узлов, которые являются предками z.

1 голос
/ 12 сентября 2008

Пример всего 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>
0 голосов
/ 12 сентября 2008

В дополнение к ответу Джона Шихана:
С JQuery я бы лучше использовал
$('#z').parents('li').addClass('myClass');
чем полагаться на фактическую структуру.

0 голосов
/ 12 сентября 2008

Это хорошо подходит для jQuery, если это доступно для вас.

$("#z").parent().parent().addClass("foo");
0 голосов
/ 11 сентября 2008

Спасибо за ввод. Я подумал, что это невозможно без разбора (или использования xsl и т. Д.) ... Ладно.

0 голосов
/ 11 сентября 2008

Добавит атрибут только к элементам с потомком элемента 'z'.

0 голосов
/ 11 сентября 2008

Я предлагаю вам разобрать его в DOM и вернуться назад, как вы думали. Регулярные выражения не очень хорошо работают для вложенных структур с произвольными уровнями вложенности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...