Микроформаты — это способ внедрения определенных семантических данных в HTML, который мы используем сегодня.
Первый вопрос, который задаст гуру XML: «Зачем использовать HTML, если XML позволяет создавать ту же семантикуЭ» Я не буду перечислять все причины, по которым XML будет лучшим или худшим выбором для кодирования данных или почему микроформаты выбрали HTML в качестве основы.
В этой статье основное внимание будет уделено тому, как работают основные правила синтаксического анализа и чем они отличаются от правил XML.
Контактная информация в HTML
Одним из самых популярных и широко используемых микроформатов является hCard. Это HTML-представление vCard («h» в hCard — сокращение от «HTML vCard»).Подробнее о hCard можно прочитать на сайте микроформаты вики .
vCard содержит основную информацию о человеке или организации.
Этот формат широко используется в приложениях адресных книг для резервного копирования и обмена контактной информацией.
По стандартам Интернета это старый формат, его спецификация — RFC2426 от 1998 года.
Это было до появления XML, поэтому синтаксис представляет собой обычный текст с некоторыми разделителями, а также начальными и конечными элементами.
Возьмем мою информацию в качестве примера:
BEGIN:VCARD FN:Brian Suda N:Suda;Brian;;; URL:http://suda.co.uk END:VCARDЭтот файл vCard содержит элементы BEGIN:VCARD и END:VCARD, которые представляют собой контейнер, позволяющий синтаксическому анализатору знать, когда прекратить сбор данных.
В одном файле может быть несколько визитных карточек, поэтому этот метод хорошо группирует данные в четкие визитные карточки.
FN означает «форматированное имя», которое используется в качестве отображаемого имени.
N – структурированное имя, в котором закодированы имя, фамилия, отчество (отчество), префиксы и суффиксы, и все это разделяется точкой с запятой.
Наконец, URL-адрес — это адрес веб-сайта, связанного с этим контактом.
Если бы нам пришлось закодировать все это в XML, результат, вероятно, выглядел бы примерно так:
<vcard> <fn>Brian Suda</fn> <n> <given-name>Brian</given-name> <family-name>Suda</family-name> </n> <url> http://suda.co.uk </url> </vcard>Давайте посмотрим, как мы можем разметить одни и те же данные в HTML с помощью микроформатов, которые широко используют атрибуты rel, rev и class для кодирования семантики.
Атрибут класса используется почти так же, как элементы используются в XML. Итак, предыдущий пример XML размечен в HTML следующим образом:
<div class="vcard"> <div class="fn">Brian Suda</div> <div class="n"> <div class="given-name">Brian</div> <div class="family-name">Suda</div> </div> <div class="url"> http://suda.co.uk </div> </div>Если бы это было все, что могли сделать микроформаты, это было бы не так интересно.
Но нет, микроформаты позволяют вам использовать семантику существующих элементов HTML, чтобы объяснить, где можно найти закодированные данные.
В этом примере каждый элемент представляет собой , но это не обязательно.
Это делает извлечение данных из HTML немного более сложным для анализатора, но более простым для автора документа.
Микроформаты не заставляют авторов менять текущую структуру HTML или стиль публикации.
В конце концов, людей, пишущих HTML, на несколько порядков больше, чем авторов, занимающихся синтаксическим анализом, так почему бы не облегчить жизнь авторам? Когда я смотрю на предыдущий пример XML, мне не нравится, что я вижу «Брайан Суда» дважды: один раз в FN, а затем снова в N. С HTML это не проблема, мы можем комбинировать эти XML-элементы, используя значения, разделенные пробелами.
атрибут класса.
Малоизвестный факт: атрибуты class, rev и rel могут иметь список значений, разделенных пробелами.
А если объединить FN и N, то получим примерно следующее:
<div class="n fn"> <div class="given-name">Brian</div> <div class="family-name">Suda</div> </div>Теперь свойство N по-прежнему имеет дочерние свойства, а FN содержит то же значение, что и раньше.
Как мы помним, HTML сжимает пробелы, поэтому значение FN по-прежнему равно «Брайан Суда», даже несмотря на то, что оно разделено между двумя элементами с пробелами внутри элементов div. Так мы обозначили возможность связывать свойства, имеющие одинаковые значения.
Следующее, что меня беспокоит в примере XML, — это то, как отображается URL-адрес: он выглядит неестественно.
В XML мы говорим о данных, но HTML отображается людям в браузере.
По совпадению, у нас есть элемент в :
<a class="n fn url" href=" http://suda.co.uk "> <span class="given-name">Brian</span> <span class="family-name">Suda</span> </a>После перехода на элемент, нам нужно заменить дочерние элементы div на промежутки, потому что элемент может содержать только дочерние элементы строкового уровня.
Микроформаты не обязывают авторов использовать определенные элементы, но для каждого случая рекомендуется использовать наиболее смысловые.
В случае URL-адресов лучше всего использовать
, поэтому правила парсинга немного изменятся (об этом мы поговорим чуть позже).Окончательный микроформат hCard в HTML будет выглядеть следующим образом:
<div class="vcard"> <a class="n fn url" href=" http://suda.co.uk "> <span class="given-name">Brian</span> <span class="family-name">Suda</span> </a> </div>На мой взгляд, это гораздо более интуитивно понятно, просто и компактно, чем пример XML в начале.
Люди уже публикуют таким образом блогроллы и ссылки, и все браузеры распознают и оформляют эту информацию, и ее легко поместить в каналы.
Парсинг с использованием XSLT
Микроформаты предназначены для работы с HTML 4 и выше.Недостаток использования XSLT заключается в том, что документ должен быть правильно сформирован, что не является обязательным в HTML 4. В HTML 4 , и теги можно использовать без закрывающих тегов.
Если бы вы использовали другую технологию для извлечения микроформатов, например REGEX или DOM, это была бы другая проблема, но с XSLT нам сначала нужно очистить HTML. Есть два простых способа сделать это:
АККУРАТНЫЙ или функция типа HTMLlib или загрузитьHTML , любой из них загрузит HTML-документ и преобразует его в действительный XSLT. Теперь, когда мы знаем, что у нас есть правильно сформированный HTML-документ, мы можем начать извлекать данные микроформатов.Ниже приведен очень грубый XSLT, далекий от совершенства, но его должно быть достаточно для начала.
Для получения дополнительной информации вы можете прочитать вики-страница microformats.org о синтаксическом анализе или используйте шаблоны XSLT, которые выполняют большую часть тяжелой работы по извлечению данных (они доступны по адресу hg.microformats.org ).
Все данные hCard содержатся в элементе класса «vcard».
В нашем примере это , но это может быть любой элемент, поэтому начнем с него:
//*[@class="vcard"]Это выражение XPath ищет любой элемент в дереве, имеющий класс «vcard».
На первый взгляд кажется, что он найдет все hCard, но проблема в том, что значение класса может представлять собой список значений, разделенных пробелами.
Таким образом, код class="vcard myStyle" не будет выбран этим выражением XPath. Чтобы исправить это, мы используем функцию contains:
//*[contains(@class,"vcard")]Так лучше, теперь мы найдем любой элемент, у которого атрибут класса содержит «vcard».
Выражение class="vcard myStyle" успешно найдет "vcard", но есть другая проблема.
Функция contains небезопасна, поскольку это поиск подстроки.
Таким образом, class="my-vcard" будет найден функцией contains() так же, как class="vcard", хотя "my-vcard" не является подходящим именем свойства, указывающим на то, что это микроформат hCard. Ложный матч.
Чтобы это исправить, вам придется немного поколдовать и окружить искомые значения пробелами, а затем искать новое значение, завернутое в пробелы.
Звучит сложно, но на самом деле это не так.
//*[contains(concat(" ",@class," "), " vcard ")]С пробелами класс «my-vcard» выглядит как «my-vcard» и не будет содержать подстроку «vcard», что решает проблему подстроки.
В противном случае класс «vcard myStyle» станет «vcard myStyle», который содержит «vcard», поэтому значения, разделенные пробелами, также находятся с использованием этого метода.
Теперь, когда мы знаем, как найти данные, давайте пройдемся по каждой hCard с помощью XSLT и начнем выводить ее как vCard. Теперь легко увидеть, как использование XSLT позволяет легко преобразовывать данные HTML практически в любой формат. Например, другой HTML, XML, RDF, текст vCard, CSV, SPARQL, JSON или что угодно еще.
Оператор for-each найдет все hCard на странице и создаст для каждого vCard. При создании vCard он применяет шаблоны для поиска внутри hCard, такие как FN, N и URL.
<xsl:for-each select="http://*[contains(concat(" ",@class," "), " vcard ")]"> <xsl:text>BEGIN:VCARD</xsl:text> <xsl:apply-templates /> <xsl:text>END:VCARD</xsl:text> </xsl:for-each>FN — это простой шаблон, который извлекает значение элемента из класса, содержащего FN.
<xsl:template match="http://*[contains(concat(" ",@class," "), " fn ")]"> <xsl:text>FN:</xsl:text><xsl:value-of select=".Схема N немного сложнее."/> </xsl:template>
Сначала ему нужно найти элемент класса, содержащего N. Затем он ищет дочерние элементы, содержащие подсвойства N, такие как имя и фамилия, и печатает их значения.
<xsl:template match="http://*[contains(concat(" ",@class," "), " n ")]"> <xsl:text>N:</xsl:text> <xsl:value-of select="http://*[contains(concat(" ",@class," "), " family-name ")]"/> <xsl:text>;</xsl:text> <xsl:value-of select="http://*[contains(concat(" ",@class," "), " given-name ")]"/> <xsl:text>;;;</xsl:text> </xsl:template>Шаблон URL-адреса использует элемент выбора, чтобы определить, где находится наиболее семантическая информация для значения URL-адреса.
Он проверяет, является ли элемент класса «url» элемент. Если да, то значение адреса извлекается из href , в противном случае используется содержимое строки.
<xsl:template match="http://*[contains(concat(" ",@class," "), " url ")]"> <xsl:text>URL:</xsl:text> <xsl:choose> <xsl:when test="local-name() = 'a'"> <xsl:value-of select="@href"/> </xsl:when> <xsl:otherwise> <xsl:value-of select=".element и многие другие несут свою собственную семантику."/> </xsl:otherwise> </xsl:choose> </xsl:template>
В исходном примере HTML URL-адрес был закодирован с использованием , и в этом случае содержимое будет извлечено, а значение URL-адреса будет таким же.
Это лишь одно из многих отличий микроформатов от XML. Анализ данных микроформата зависит от того, в каком типе и элементе HTML они были закодированы.
Это был очень краткий обзор извлечения данных в микроформатах.
Существуют также правила, которые зависят от типа свойства vCard и от того, на основе чего построен HTML-элемент. Для получения более подробной информации, пожалуйста, свяжитесь микроформаты вики , моя PDF-книга Использование микроформатов , или вы всегда можете написать мне на почту, а также подписаться на рассылку разработчиков микроформата, если у вас возникнут вопросы.
Теги: #микроформаты #программирование #xslt #HTML #микроформаты
-
Бернэм, Шербирн Уэсли
19 Oct, 24 -
Малайзия
19 Oct, 24 -
Icann Проведет Голосование По Зоне .Xxx
19 Oct, 24 -
Атака На Ipv6: Исчерпание Таблицы Ndp
19 Oct, 24