XSL: сопоставление по элементу совпадает с сопоставлением по имени элемента? - PullRequest
1 голос
/ 13 марта 2019

Моя компания получила файл XSL для адаптации к использованию моим отделом.В этом файле есть строки, подобные приведенным ниже:

<xsl:template match="title | *[name() = 'title' or contains(@class, '/title ')]">

Насколько я понял, match="title" было таким же, как match="*[name()='title']", что сделало бы начальный title избыточным.Однако файл изначально был написан третьей стороной, специализирующейся на разработке XML / XSL / HMTL, поэтому я предполагаю, что он существует по какой-то причине?

1 Ответ

2 голосов
/ 13 марта 2019

Может быть разница, если задействованы пространства имен. name() вернет любой префикс пространства имен в XML. И title будет соответствовать только элементам title без пространства имен или в пространстве имен, указанном xpath-default-namespace в XSLT (при использовании XSLT 2.0).

Рассмотрим этот придуманный XML

<titles>
    <title id="1" />
    <title id="2" xmlns="test2" />
    <test3:title id="3" xmlns:test3="test3" />
</titles>

Шаблон, соответствующий просто title, будет соответствовать только первому, но *[name() = 'title'] будет соответствовать первым двум. Таким образом, в этом случае title все еще избыточен в вашем совпадении.

Однако в XSLT 2.0 вы можете использовать xpath-default-namespace в таблице стилей, чтобы указать пространство имен по умолчанию для нефиксированных элементов в выражении.

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xpath-default-namespace="test3">

В этом случае шаблон, соответствующий title, будет соответствовать третьему title в XML (<test3:title id="3" xmlns:test3="test3" />), но шаблон, соответствующий *[name() = 'title'], будет соответствовать первым двум.

Обратите внимание, есть также local-name(), который возвращает только имя узла без префикса пространства имен, поэтому выполнение *[local-name() = 'title'] будет соответствовать всем трем title элементам.

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