在xml字符串中突出显示父母

时间:2020-03-05 18:51:36  来源:igfitidea点击:

说我有:

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

显然,我可以将其解析为某种关联数组,然后向后递归。有什么想法我仅通过文本处理(字符串替换,正则表达式等)如何做到?

谢谢!

解决方案

回答

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

回答

我会使用XSLT。我们可以指定搜索作为z祖先的节点。

回答

xpath的祖先轴包括当前上下文节点的所有祖先。

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

*任何元素
[@ id =" z"]的属性ID的值为z(由于属性ID为ID,因此只能(或者应该是)一个这样的元素)
/ ancestor :: li是该祖先的所有li元素

另请参阅:https://www.w3schools.com/xml/xpath_axes.asp

回答

仅将属性添加到后代元素为" z"的元素。

回答

感谢输入。我认为如果不进行解析(或者使用xsl等)就不可能了。

回答

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

回答

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

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

回答

除了约翰·希恩(John Sheehan)的答案之外:
对于JQuery,我宁愿使用
$('#z')。parents('li')。addClass('myClass');`
而不是依靠实际结构。