Строки локализации XSLT-источника из вторичного XML-файла - PullRequest
0 голосов
/ 14 января 2019

Это лучше всего продемонстрировать на коротком примере.

Основной XML:

<?xml version="1.0" encoding="UTF-8"?>
<catalog>
  <cd>
    <title>Empire Burlesque</title>
    <artist>Bob Dylan</artist>
  </cd>
  <cd>
    <title>Hide your heart</title>
    <artist>Bonnie Tyler</artist>
  </cd>
</catelo>

Вторичный XML, назовем его localisation.es.xml.

<?xml version="1.0" encoding="UTF-8"?>
<localisation lang="es">
    <field id="title">Título</field>
    <field id="artist">Artista</field>
</localisation>

Желаемый вывод:

<html>
  <table>
    <thead>
      <tr>   <td>Título</td>            <td>Artista</td>      </tr>
    </thead>
    <tbody>
      <tr>   <td>Empire Burlesque</td>  <td>Bob Dylan</td>    </tr>
      <tr>   <td>Hide your heart</td>   <td>Bonnie Tyler</td> </tr>
    </tbody>
  </table>
</html>

Как видите, данные поступают из основного файла XML, а строки локализации для имен полей - из вторичного XML. Как написать XSLT для рассмотрения дела?


Кроме того, что если поля неизвестны XSLT? Скажем, кто-то добавил новое поле <year> для каждой записи в основном XML и добавил строку для него в localisation.es.xml:

    <field id="year">Año</field>

Можно ли сгенерировать желаемый результат без изменения файла XSLT?

Спасибо.

1 Ответ

0 голосов
/ 14 января 2019

Это можно сделать с помощью справочных таблиц, для этого требуется XSLT 2.0.

В вашем xslt вы должны создать ключ и переменную, содержащую таблицы поиска (в данном случае ваш файл локализации). Всякий раз, когда вам нужен файл из справочных таблиц, вы можете найти правильное значение с помощью ключа.

Итак, сначала определите переменную и ключ.

<xsl:variable name="localisation" select="document('localisation.es.xml')"/>
<xsl:key name="locKey" match="localisation/field" use="@id"/>

Тогда, когда вам нужно найти строку для заголовка, вы должны выбрать ее следующим образом

<xsl:value-of select="key('locKey', 'title', $lookup)"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...