我对XPath
有些新意,所以请事先原谅我。我希望能够搜索HTML评论,特别是条件评论,并仅返回某些标记,例如<link>
和<script>
。
到目前为止,我已经能够返回包含这些标记的注释集合://comment()[contains(.,'link') or contains(.,'script')]
,但此时,我不确定如何将实际标记本身提取为具有属性的节点
有人能帮帮我吗?
以下是我试图从中检索各种元素的示例: 我需要能够获取链接和脚本元素。可能也应该提到我正在使用C#和HTML Agility Pack。
<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>
答案 0 :(得分:1)
到目前为止,我已经能够返回一系列评论 包含这些标签:
//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" />
答案 1 :(得分:0)
使用元素名称(你称之为“tag”,称为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只会在此处看到注释。