在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');`
而不是依靠实际结构。