XSLT 2.0 Внешний поиск с помощью ключа () и документ ()

Щелкните правой кнопкой по пункту меню Computer на меню "Пуск" и избранному 'Шоу на Рабочем столе' из контекстного меню, которое открывается.

5
задан 14 August 2009 в 15:01
поделиться

2 ответа

В XSLT 2.0 есть два способа делать то, что вы хотите:

Один - это трехпараметрическая версия функции ключа . Третий параметр позволяет указать корневой узел, с которым должен работать ключ (по умолчанию это всегда корень основного документа):

<xsl:value-of select="key('genre-lookup', $curr-genrecode,$lookupDoc)/@Genre"/>

Другой способ - использовать функцию ключа под ] $ lookupDoc узел:

<xsl:value-of select="$lookupDoc/key('genre-lookup', $curr-genrecode)/@Genre"/>

Оба этих метода описаны в спецификации XSLT 2.0 для ключей и не будут работать в XSLT 1.0.

Для полноты картины вам придется переписать это, чтобы не использовать ключи, если вы ограничены XSLT 1.0.

<xsl:value-of select="$lookupDoc//GenreMapping[@DepartmentCode = $curr-genrecode]/@Genre"/>

Ага! Проблема в select = "$ lookupDoc" в вашем вызове apply-templates вызывает шаблон по умолчанию, а не тот, который вы ожидаете,

8
ответ дан 14 December 2019 в 04:44
поделиться

Хорошо, это немного ментально, и я не утверждаю, что понимаю это, но это работает (похоже на карьеру программиста).

Проблема, с которой я столкнулся, заключалась в том, когда Я вызываю шаблоны apply и передаю внешний документ в качестве переменной, он никогда не совпадал ни с какими шаблонами, даже с теми, которые называются «Genremapping».

Поэтому я использовал подстановочный знак, чтобы поймать его, а также при вызове шаблонов apply я сузил круг узел установлен как дочерний элемент, который меня интересовал. Это было довольно безумно: я мог распечатать имя узла и увидеть «GenreMapping», но он никогда не входил ни в один шаблон, который я назвал «GenreMapping», выбирая вместо этого, чтобы всегда переходить только к «*» шаблон.

Это означает, что мой новый шаблон сопоставления вызывается для каждого отдельного узла GenreMapping, поэтому это может быть немного неэффективным.Тогда я понял, что все, что мне нужно сделать, это вывести что-нибудь, если предикат совпадает.

Итак, теперь это выглядит так (никакой ключ не используется):

...
<xsl:template match="/something">
<stuff>
   <xsl:for-each select="monkey">
      <Genre>
         <key_value><xsl:value-of select="genrecode"/></key_value>
         <xsl:variable name="key_val"><xsl:value-of select="genrecode"/></xsl:variable>
         <code>
      <xsl:apply-templates select="$lookupDoc/*/*/*/*">
         <xsl:with-param name="curr-genrecode" select="string(genrecode)"/>
      </xsl:apply-templates>

         </code>
      </Genre>
   </xsl:for-each>
</stuff>
</xsl:template >


<xsl:template match="*">
   <xsl:param name="curr-genrecode"/>
   <xsl:value-of select=".[@DepartmentCode = $curr-genrecode]/@Genre"/>
</xsl:template>
...

Все это выводит: Обратите внимание, последнее значение key_value правильно не имеет записи кода, так как в справочном документе нет совпадений.

<?xml version="1.0" encoding="UTF-8"?>
<stuff xmlns:xs="http://www.w3.org/2001/XMLSchema">
   <Genre>
      <key_value>AAA</key_value>
      <code>10 - NEWS</code>
   </Genre>
   <Genre>
      <key_value>AAA</key_value>
      <code>10 - NEWS</code>
   </Genre>
   <Genre>
      <key_value>BBB</key_value>
      <code>11 - NEWS</code>
   </Genre>
   <Genre>
      <key_value>SVVS</key_value>
      <code/>
   </Genre>
</stuff>

Ответ на почтовый индекс. Спасибо за помощь, Велбог.

0
ответ дан 14 December 2019 в 04:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: