XSLT: Как сгенерировать атрибут id HTML, значение которого является постоянным независимо от изменения исходного XML, а также надлежащим как часть URL

#url #xslt

#url #xslt

Вопрос:

Я использую XSLT 1.0 для преобразования исходного XML-файла в HTML-документ. В исходном файле есть section элементы.

 <section name="Name of this section">
    ...
</section>
 

И он преобразуется в HTML следующим образом ( h2 может изменяться на h3 h4 , и т.д. в зависимости от уровня вложенности).

 <h2 id="...">Name of this section</h2>
 

id атрибут используется для ссылки на этот раздел из другого HTML-документа.

 <a href="https://www.example.org/document.html#(valude of id attribute)">Link to the section</a>
 

В настоящее geterate-id время функция используется для генерации значения id атрибута. Но это может измениться при изменении структуры исходного XML-файла. И это приводит к разрыву ссылки из другого HTML-документа. Поэтому я хотел бы сделать значение id атрибута постоянным, даже если структура исходного файла изменена.

Сначала я рассматривал возможность использования значения name атрибута. Но иногда он включает символы, которые не являются частью URL-адреса (пробел, вопросительный знак, символы, отличные от ASCII UTF-8, и т.д.). Поэтому его нельзя использовать.

Затем я рассмотрел возможность добавления id атрибута к section элементу исходного XML-файла и использования его как есть в HTML-файле. Это, безусловно, обеспечивает правильное значение, но добавление его ко всем section элементам в исходном файле вызывает беспокойство. Поэтому я хотел бы думать об этом как о последнем средстве.

Тогда есть ли какой-либо способ генерировать значение id атрибута, которое является постоянным независимо от изменения исходного файла, а также надлежащим как часть URL?

Комментарии:

1. Итак, как / где / когда вы генерируете идентификатор в ссылке другого документа? Если ваш алгоритм там работает, вам нужно применить тот же самый. Или сгенерировать оба в одном коде, т.е. в XSLT 2 или 3, которые вы можете использовать xsl:result-document для создания отдельных документов с одним преобразованием.

2. @MartinHonnen К сожалению, html-документы, ссылающиеся на наши, поддерживаются другой организацией и находятся вне нашего контроля. Поэтому применить наш алгоритм к их документам невозможно. Вот почему я хотел бы сделать значение атрибута ‘id’ постоянным независимо от изменений исходного файла.

Ответ №1:

Сопровождающий документов, ссылающихся на мой, рассказал мне encode-for-uri() о XSLT 2.0 и str:encode-uri() EXSLT. Я использую xsltproc libxslt в качестве процессора, и он поддерживает EXSLT. Поэтому я решил использовать str:encode-uri(@name) в качестве значения id атрибута. В этом есть два недостатка. Сначала это не гарантирует уникальность. Если в section исходном XML-файле есть несколько элементов с одинаковым name значением атрибута, то id значение будет дублироваться. Второй момент заключается в том, что при изменении значения name атрибута id значение также изменяется. Однако в моем случае они действительно не имеют значения. Значение name атрибута уникально в исходном файле и редко изменяется. Таким образом, я могу сделать id уникальный и почти достаточно постоянный для моего случая.