Нужна помощь ... выбор HTML-тегов из условных комментариев с помощью XPath - PullRequest
3 голосов
/ 28 января 2012

Я немного новичок в XPath, так что прости меня заранее. Я хотел бы иметь возможность искать комментарии HTML, в частности условные комментарии, и возвращать только определенные теги, такие как <link> и <script>.

До сих пор я был в состоянии вернуть коллекцию комментариев, содержащих эти теги, с: //comment()[contains(.,'link') or contains(.,'script')], но на данный момент я не уверен, как извлечь сами фактические теги как узлы с атрибутами.

Может кто-нибудь помочь мне, пожалуйста?

Вот пример того, из чего я пытаюсь получить различные элементы: Мне нужно иметь возможность получить ссылку и элементы скрипта. Вероятно, следовало также упомянуть, что я использую C # и пакет Agility для 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>

Ответы [ 2 ]

1 голос
/ 29 января 2012

До сих пор я был в состоянии вернуть коллекцию комментариев, которые содержат эти теги с: //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;
0 голосов
/ 28 января 2012

Используйте имя элемента (то, что вы называете «тегом», на языке 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 увидит здесь только комментарии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...