#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
уникальный и почти достаточно постоянный для моего случая.