один xslt, чтобы управлять ими всеми - PullRequest
2 голосов
/ 12 января 2011

Итак, вот моя проблема ...

У меня есть 2 xsl-преобразования, и у них обоих есть xsl: for-each в них в качестве отправной точки.

Мне нужно создать одно (master) xslt который будет их вызывать.Но, конечно, есть одна загвоздка.

Этот новый xslt должен выдавать один узел из первого xslt, а затем второй узел (оба xslt имеют EmployeeId, но в основном это разные отчеты, которые должны быть напечатаны одинза другим).

Поскольку эти существующие xslt имеют for-each в них, когда я включаю их в этот мастер xslt, я получаю вывод: все узлы из первого xslt, затем все узлы из второго.

Также эти 2 xslt должны быть обратно совместимы, поэтому они должны работать как прежде, если они не вызываются из этого мастер-шаблона.

Я начинающий xslt, и мне удалось создать некоторые отчеты при работетолько с одним xslt, но я не могу найти решение этой проблемы, поэтому я ценю всю помощь, которую могу получить.

Я думал о создании нового xslt, который был бы смесью двухчто у меня есть, но это было исключено моим боссом.

Спасибо, Benxy

РЕДАКТИРОВАТЬ:

Вот некоторые примеры в соответствии с просьбой:

Этоэто фirst xslt:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" version="4.0" encoding="windows-1250" indent="yes" omit-xml-declaration="yes" />
<xsl:template match="/" name="testXslt1">
    <xsl:for-each select="a">   
        <table>
            <tr>
                <td>
                    <xsl:value-of select="@SomeData"></xsl:value-of>
                </td>
                etc.            
            </tr>
            <xsl:apply-templates select="b" mode="tmp"/> 
        </table>
    </xsl:for-each>
</xsl:template>

<xsl:template match="node()" mode="tmp">
    <tr >
        <td><xsl:value-of select="@SomeOtherData"></xsl:value-of></td>
        etc.
    </tr>
</xsl:template>

Второй xslt аналогичен первому.

В Master xslt я импортировал бы их обоих и в каждом шаблоне вызовов testXslt1 и testXslt2.

1 Ответ

0 голосов
/ 12 января 2011

Этот новый xslt должен дать выходной узел сначала xslt, затем один узел со второго

Вот простой пример того, как это можно сделать :

Это преобразование объединяет результаты двух шаблонов, которые применяются к документу XML.

Первые шаблоны создают двойное значение для каждого узла /*/*. Второе преобразование дает квадрат значения каждого узла /*/*. Результаты применения двух remplates каждый на XML-документе смешиваются вместе поочередно по мере необходимости, и это конечный результат:

<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="vrtfResults1">
    <xsl:apply-templates select="/"
         mode="transform1"/>
  </xsl:variable>
  <xsl:variable name="vrtfResults2">
    <xsl:apply-templates select="/"
         mode="transform2"/>
  </xsl:variable>

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

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

   <xsl:for-each select="$vResults1">
     <xsl:variable name="vPos" select="position()"/>

     <xsl:copy-of select=".|$vResults2[$vPos]"/>
   </xsl:for-each>

   <xsl:if test=
     "count($vResults2) > count($vResults2)">
     <xsl:copy-of select=
      "$vResults2[position()>count($vResults1)]"/>
   </xsl:if>
 </xsl:template>

 <xsl:template match="/" mode="transform1">
   <xsl:for-each select="/*/*">
    <xsl:copy>
     <xsl:value-of select=".+."/>
    </xsl:copy>
   </xsl:for-each>
 </xsl:template>

 <xsl:template match="/" mode="transform2">
   <xsl:for-each select="/*/*">
    <xsl:copy>
     <xsl:value-of select=".*."/>
    </xsl:copy>
   </xsl:for-each>
 </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>1</num>
<num>4</num>
<num>4</num>
<num>6</num>
<num>9</num>
<num>8</num>
<num>16</num>
<num>10</num>
<num>25</num>
<num>12</num>
<num>36</num>
<num>14</num>
<num>49</num>
<num>16</num>
<num>64</num>
<num>18</num>
<num>81</num>
<num>20</num>
<num>100</num>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...