需要帮助..使用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>

需要帮助..使用XPath从条件注释中选择HTML标记

到目前为止,我已经能够返回一组评论包含那些带有://comment()[contains(.,'link') or contains(.,'script')]的标签,但在这一点上,我不确定如何提取实际的标记本身是具有属性的节点。

这是不可能的,因为在评估XPath表达式时,注释中没有节点,只有字符串。

可以做的是获得所需的字符串

例如,当上下文节点是以下两个注释之一时,评估此XPath表达式的结果

   "substring-before(substring-after(., '>'),
                     '&lt;![endif]'
                     )

分别为:

  &lt;link rel="stylesheet" href="/layout/css/IE7.css" /&gt;
  &lt;link rel="stylesheet" href="/layout/css/IE9.css" /&gt;

基于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(., '>'),
                     '&lt;![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表达式在每个注释节点上进行求值,并输出求值结果:

  &lt;link rel="stylesheet" href="/layout/css/IE7.css" /&gt;
  &lt;link rel="stylesheet" href="/layout/css/IE9.css" /&gt;

使用元素名称(您所称的"标记"在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只会在这里看到注释。