Является ли гирляндная цепочка xslt принятой практикой? - PullRequest
9 голосов
/ 31 декабря 2010

У меня есть ситуация, когда я думаю, что мне нужно последовательно соединить мое преобразование xslt (то есть, что выход одного преобразования xslt вводится в другой).Первое преобразование довольно сложное с большим количеством xsl: choice и предков xpath.Моя мысль состоит в том, чтобы преобразовать xml в xml, который затем можно легко преобразовать в html.

Мой вопрос: «Это стандартная практика или я что-то упускаю?»

Заранее спасибо.

Стивен

Ответы [ 3 ]

10 голосов
/ 31 декабря 2010

Выполнение цепочки преобразований довольно часто используется в приложениях XSLT , хотя выполнение этого полностью в XSLT 1.0 требует использования специфичной для поставщика функции xxx:node-set().В XSLT 2.0 такого расширения не требуется, поскольку там исключен печально известный тип данных RTF.

Вот пример (слишком просто, чтобы иметь смысл, но полностью иллюстрирующий, как это делается):

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:ext="http://exslt.org/common">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/">
   <xsl:variable name="vrtfPass1">
    <xsl:apply-templates select="/*/*"/>
   </xsl:variable>

   <xsl:variable name="vPass1"
        select="ext:node-set($vrtfPass1)"/>

   <xsl:apply-templates mode="pass2"
        select="$vPass1/*"/>
 </xsl:template>

 <xsl:template match="num[. mod 2 = 1]">
  <xsl:copy-of select="."/>
 </xsl:template>

 <xsl:template match="num" mode="pass2">
  <xsl:copy>
    <xsl:value-of select=". *2"/>
  </xsl:copy>
 </xsl:template>
</xsl:stylesheet>

, когда это преобразование применяется к следующему документу XML :

<nums>
  <num>01</num>
  <num>02</num>
  <num>03</num>
  <num>04</num>
  <num>05</num>
  <num>06</num>
  <num>07</num>
  <num>08</num>
  <num>09</num>
  <num>10</num>
</nums>

желаемый, правильный результат :

<num>2</num>
<num>6</num>
<num>10</num>
<num>14</num>
<num>18</num>

Объяснение :

  1. На первом шаге документ XML преобразуется , а результат определяется какзначение переменной $vrtfPass1.При этом копируются только элементы num, имеющие нечетное значение (не четное).

  2. Переменная $vrtfPass1, имеющая тип RTF, не может напрямую использоваться для выражений XPath, поэтому мы преобразуем его в обычное дерево, используя функцию EXSLT (реализованную большинством процессоров XSLT 1.0) ext:node-set и определяя другую переменную - $vPass1, значением которой является это дерево.

  3. Теперь мы выполняем второе преобразование в нашей цепочке преобразований - по результату первого преобразования, которое сохраняется как значение переменной $vPass1.Чтобы не связываться с шаблоном первого прохода, мы указываем, что новая обработка должна быть в именованном режиме, называемом «pass2».В этом режиме значение любого элемента num умножается на два.

Решение XSLT 2.0 (без RTF):

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/">
  <xsl:variable name="vPass1" >
   <xsl:apply-templates select="/*/*"/>
  </xsl:variable>
   <xsl:apply-templates mode="pass2"
        select="$vPass1/*"/>
 </xsl:template>

 <xsl:template match="num[. mod 2 = 1]">
  <xsl:copy-of select="."/>
 </xsl:template>

 <xsl:template match="num" mode="pass2">
  <xsl:copy>
    <xsl:value-of select=". *2"/>
  </xsl:copy>
 </xsl:template>
</xsl:stylesheet>
1 голос
/ 31 декабря 2010

Если это ваша ситуация (или может стать вашей ситуацией):

  1. Преобразовать исходный XML в промежуточный XML.
  2. Возможно преобразовать промежуточный XML в final1_html.
  3. Возможно преобразовать промежуточный xml в final2_html (совсем не так, как final1_html).

или

  1. Преобразовать исходный xml в промежуточный xml.Вероятно, со временем это изменится.
  2. Преобразование промежуточного XML-файла в final_html.Это вряд ли изменится со временем.

Тогда имеет смысл использовать двухэтапное преобразование.

Если это ваша ситуация:

  1. Преобразуйте исходный xml в промежуточный xml.
  2. Преобразуйте промежуточный xml в final_html.

Тогда не используйте два шага.Вместо этого просто выполните одно преобразование.

0 голосов
/ 31 декабря 2010

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

Однако, если обработка сложная, разделение ее на несколько шагов (применение разных преобразований на каждом шаге) действительно может упростить каждый шаг и иметь смысл.

Это действительно зависит от конкретной ситуации.

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