需要帮助..使用XPath从条件注释中选择HTML标记
本文关键字:注释 选择 HTML 标记 条件 帮助 使用 XPath | 更新日期: 2023-09-27 18:21:37
我对XPath
有些陌生,所以请提前原谅我。我希望能够搜索HTML注释,特别是条件注释,并且只返回某些标记,如<link>
和<script>
。
到目前为止,我已经能够返回一组注释,其中包含带有://comment()[contains(.,'link') or contains(.,'script')]
的标签,但在这一点上,我不确定如何将实际标签本身提取为具有属性的节点。
有人能帮我吗?
以下是我试图从中检索各种元素的示例:我需要能够抓取链接和脚本元素。可能还应该提到我正在使用C#和HTML敏捷包。
<head>
<!--[if IE 7]>
<link rel="stylesheet" href="/layout/css/IE7.css" />
<![endif]-->
<!--[if IE 9]>
<link rel="stylesheet" href="/layout/css/IE9.css" />
<![endif]-->
</head>
到目前为止,我已经能够返回一组评论包含那些带有:
//comment()[contains(.,'link') or contains(.,'script')]
的标签,但在这一点上,我不确定如何提取实际的标记本身是具有属性的节点。
这是不可能的,因为在评估XPath表达式时,注释中没有节点,只有字符串。
可以做的是获得所需的字符串。
例如,当上下文节点是以下两个注释之一时,评估此XPath表达式的结果:
"substring-before(substring-after(., '>'),
'<![endif]'
)
分别为::
<link rel="stylesheet" href="/layout/css/IE7.css" />
<link rel="stylesheet" href="/layout/css/IE9.css" />
基于XSLT的验证:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="comment()">
<xsl:value-of select=
"substring-before(substring-after(., '>'),
'<![endif]'
)"/>
</xsl:template>
</xsl:stylesheet>
当此转换应用于所提供的XML文档时:
<head>
<!--[if IE 7]>
<link rel="stylesheet" href="/layout/css/IE7.css" />
<![endif]-->
<!--[if IE 9]>
<link rel="stylesheet" href="/layout/css/IE9.css" />
<![endif]-->
</head>
XPath表达式在每个注释节点上进行求值,并输出求值结果:
<link rel="stylesheet" href="/layout/css/IE7.css" />
<link rel="stylesheet" href="/layout/css/IE9.css" />
使用元素名称(您所称的"标记"在XML/XPath中被称为元素),这将选择它和所有附加的节点,其中包括元素的所有属性。
因此,如果您的文档看起来像:
<html>
<head>
<link rel="stylesheet" type="text/css" href="theme.css" />
</head>
<body>
...
</body>
</html>
您可以使用以下XPath:
/html/head/link
返回的节点集将包含所有link
元素,然后您可以查询它们的属性值。
更新:
看到示例标记,事情有点复杂。。。您正在使用IE条件注释。
这使得中的项对于除IE的之外的所有浏览器/解析器都显示为注释。这是一个问题,因为您想要检索注释中嵌入的<link>
"元素"。
您需要自己去掉条件注释——一个专门的手写解析器可能是最好的选择,因为HAP只会在这里看到注释。