контекст счетчика циклов xslt, значение сверху - PullRequest
1 голос
/ 02 января 2012
<Root>
  <Envelope>
    <Header>
      <ineed>apple</ineed>
    </Header>
    <success></success>
  </Envelope>
  <Envelope>
    <Header>
      <ineed>apple</ineed>
    </Header>
    <success></success>
  </Envelope>


  <Envelope>
    <Header>
      <ineed>apple</ineed>
    </Header>
    <criticalerror></criticalerror>
  </Envelope>
  <Envelope>
    <Header>
      <ineed>apple</ineed>
    </Header>
    <success></success>
  </Envelope>


  <Envelope>
    <Header>
      <ineed>apple</ineed>
    </Header>
    <criticalerror></criticalerror>
  </Envelope>
  <Envelope>
    <Header>
      <ineed>apple</ineed>
    </Header>
    <criticalerror></criticalerror>
  </Envelope>


  <Envelope>
    <Header>
      <ineed>apple</ineed>
    </Header>
    <milderror></milderror>
  </Envelope>
  <Envelope>
    <Header>
      <ineed>apple</ineed>
    </Header>
    <success></success>
  </Envelope>
</Root>

Привет,

Я не уверен, как заставить это работать с xslt.XML-файл содержит элементы «Envelope» всегда в четном количестве случаев, причина в том, что xml будет указывать нам успех, ошибку или предупреждение на основе пар (первая и вторая, третья и четвертая и т. Д.)Наивысшим приоритетом является элемент «critalerror», т. Е. Если этот элемент присутствует в паре, пара считается ошибкой, элемент также может встречаться дважды.

Следующий приоритет - «milderror».элемент, который обозначает предупреждение.Третий приоритет идет на элемент «успех».Следовательно, только если оба содержат «успех» в паре, рассматриваемый как успех.

Для вышеуказанного случая первая пара - это успех, вторая - ошибка, третья - ошибка, четвертая - предупреждение.Есть две ошибки, одна ошибка и одно предупреждение.Это даст XML, как показано ниже.Опять же, ошибка имеет более высокий приоритет (сначала возникает в xml), затем появляется предупреждение

<Root>
  <error></error>
  <error></error>
  <warning></warning>
  <success></success>
</Root>

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

В связи с моим успехом для каждого действия мне нужно получить элемент "ineed" из верхнего xml, соответствующийпара успеха, которая является «яблоком», это может происходить в одном или обоих, в паре верхнего xml.То же самое для пары, однако может встречаться как в одном, так и в обоих случаях.

Все, что у меня есть, это переменная context loopcount (в данном случае 1) для успеха, которая будет повторяться для всех сценариев успеха

Аналогично сценарию ошибки (в данном случае 2 раза), необходимо получить соответствующий элемент "ineed" из верхнего xml.Переменная Loopcount 1, в следующий раз переменная loopcount будет 2

То же самое и для сценария предупреждения.

Ответы [ 2 ]

1 голос
/ 02 января 2012

Вот полное решение :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/*">
     <Root>
      <xsl:apply-templates select="Envelope[position() mod 2 = 1]">
       <xsl:sort select=
         "not((.|following-sibling::Envelope[1])/criticalerror)"/>
       <xsl:sort select=
         "not((.|following-sibling::Envelope[1])/milderror)"/>
      </xsl:apply-templates>
     </Root>
 </xsl:template>

 <xsl:template match=
  "Envelope
    [position() mod 2 = 1
   and
     success
   and
     following-sibling::Envelope[1]/success
    ]">

  <success>
   <xsl:call-template name="getTitle"/>
  </success>
 </xsl:template>

 <xsl:template match=
  "Envelope
    [position() mod 2 = 1
   and
     (.|following-sibling::Envelope[1])/criticalerror
    ]">

  <error>
   <xsl:call-template name="getTitle"/>
  </error>
 </xsl:template>

 <xsl:template match=
  "Envelope
    [position() mod 2 = 1
   and
     (.|following-sibling::Envelope[1])/milderror
   and
     not((.|following-sibling::Envelope[1])/criticalerror)
    ]">

  <warning>
   <xsl:call-template name="getTitle"/>
  </warning>
 </xsl:template>

 <xsl:template name="getTitle">
  <xsl:value-of select=
    "(.|following-sibling::Envelope[1])
         /Header/ineed[normalize-space()]
                                       [1]
    "/>
 </xsl:template>
 <xsl:template match="text()"/>
</xsl:stylesheet>

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

<Root>
    <Envelope>
        <Header>
            <ineed>apple</ineed>
        </Header>
        <success></success>
    </Envelope>
    <Envelope>
        <Header>
            <ineed>apple</ineed>
        </Header>
        <success></success>
    </Envelope>
    <Envelope>
        <Header>
            <ineed>apple</ineed>
        </Header>
        <criticalerror></criticalerror>
    </Envelope>
    <Envelope>
        <Header>
            <ineed>apple</ineed>
        </Header>
        <success></success>
    </Envelope>
    <Envelope>
        <Header>
            <ineed>apple</ineed>
        </Header>
        <criticalerror></criticalerror>
    </Envelope>
    <Envelope>
        <Header>
            <ineed>apple</ineed>
        </Header>
        <criticalerror></criticalerror>
    </Envelope>
    <Envelope>
        <Header>
            <ineed>apple</ineed>
        </Header>
        <milderror></milderror>
    </Envelope>
    <Envelope>
        <Header>
            <ineed>apple</ineed>
        </Header>
        <success></success>
    </Envelope>
</Root>

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

<Root>
   <error>apple</error>
   <error>apple</error>
   <warning>apple</warning>
   <success>apple</success>
</Root>

Объяснение

  1. Нет <xsl:for-each> используется, только <xsl:apply-templates>.

  2. Шаблоны явно применяются только к первым Envelope каждой пары Envelope элементов.

  3. Порядок, в котором выводится результат обработки элементов (в списке узлов, указанном в атрибуте select xsl:apply-templates), указывается в двух xsl:sort инструкциях - ошибки первого запуска затем предупреждения, затем все остальное (успех).

  4. Мы используем тот факт, что при сортировке логических значений false() предшествует true().

  5. Шаблон с именем getTitle вызывается для вывода значения искомой строки первого непустого элемента ineed, содержащегося в соответствующей паре элементов Envelope.

0 голосов
/ 02 января 2012

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

Затем напишите шаблон для этих элементов. В этом шаблоне вы можете получить второй элемент пары с выражением XPath «follow-sibling :: Envelope [1]».

Если вам нужно отсортировать нечетные элементы, вы можете сделать что-то вроде этого:

И так далее.

...