Выбор первого узла в нескольких переменных XSL - PullRequest
2 голосов
/ 17 июня 2011

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

Для начала, вот некоторый XML, который генерирует моя страница:

<root>
  <content>
    <Title>Title 1 here</Title>
    <Image>Image Link 1 here</Image>
    <Description>Description 1 here</Description>
    <Category>Special Exhibitions</Category>
    <Priority>2</Priority>
  </content>
    <content>
    <Title>Title 2 here</Title>
    <Image>Image Link 2 here</Image>
    <Description>Description 2 here</Description>
    <Category>Special Exhibitions</Category>
    <Priority>1</Priority>
  </content>
  <content>
    <Title>Title 3 here</Title>
    <Image>Image Link 3 here</Image>
    <Description>Description 3 here</Description>
    <Category>Live Music</Category>
    <Priority>9</Priority>
  </content>
    <content>
    <Title>Title 4 here</Title>
    <Image>Image Link 4 here</Image>
    <Description>Description 4 here</Description>
    <Category>Lecture</Category>
    <Priority>7</Priority>
  </content>
    <content>
    <Title>Title 5 here</Title>
    <Image>Image Link 5 here</Image>
    <Description>Description 5 here</Description>
    <Category>Special Exhibitions</Category>
    <Priority>3</Priority>
  </content>
    <content>
    <Title>Title 6 here</Title>
    <Image>Image Link 6 here</Image>
    <Description>Description 6 here</Description>
    <Category>Workshop</Category>
    <Priority>10</Priority>
  </content>
    <content>
    <Title>Title 7 here</Title>
    <Image>Image Link 7 here</Image>
    <Description>Description 7 here</Description>
    <Category>Special Exhibitions</Category>
    <Priority>6</Priority>
  </content>
</root>

По сути, каждый элемент <content> имеет различных дочерних элементов, включая <Category> и <Priority>.

. Моя проблема заключается в том, что я хочу выбрать только первый узел с <Category=Special Exhibition>,упорядочено по <Priority>, так что в данном случае, «Заголовок 2».

Вот что я имею в качестве XSL:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="/">  
        <xsl:apply-templates select="root/EventType/Type">
        </xsl:apply-templates>
      </xsl:template>

    <xsl:template match="Type">
      <xsl:variable name="categoryType" select="." />
      <xsl:apply-templates select="../../content[Category=$categoryType]">
    </xsl:apply-templates>

  </xsl:template>
<xsl:template match="/">
<xsl:for-each select="root/content">
      <xsl:sort data-type="number" order="ascending" select="Priority"/>
      <xsl:if test="(Category='Special Exhibitions')">
        <xsl:choose>
          <xsl:when test="(position()=1)">
            <div class="slide-container">
              <img style="margin-top:18px;" src="{BannerImage}" alt="{Title}" title="{Title}"/>
              <span>
                <xsl:attribute name="class">
                  <xsl:text>slide-caption</xsl:text>
                </xsl:attribute>
                <xsl:value-of select="Title"></xsl:value-of>
                <xsl:text> | </xsl:text>
                <xsl:value-of select="Date"></xsl:value-of>
              </span>
            </div>
          </xsl:when>
        </xsl:choose>
      </xsl:if>
    </xsl:for-each>

  </xsl:template>
</xsl:stylesheet>

Очевидно, что моя проблема где-то внутри <xsl:if> и <xsl:when> раздел.Вот как мой разум думает о поиске узла, но, очевидно, не так, как XSL!Кто-нибудь может дать мне указатель о том, как атаковать это?

Большое спасибо заранее -

Ответы [ 2 ]

2 голосов
/ 17 июня 2011

Не используйте сортировку или когда.Выберите нужный узел с помощью xpath:

<xsl:template match="/">
  <xsl:for-each select="/root/content
                        [Category = 'Special Exhibitions']
                        [Priority = min(/root/content[Category =
                                                     'Special Exhibitions']/Priority)]
                        [1]">
    <div class="slide-container">
      <img style="margin-top:18px;" src="{BannerImage}" alt="{Title}" title="{Title}"/>
      <span class="slide-caption">
        <xsl:value-of select="concat(Title, ' | ', Date)"/>
      </span>
    </div>
</xsl:for-each>

Или с XPath 1.0:

<xsl:for-each select="/root/content
                      [Category = 'Special Exhibitions']
                      [not(Priority &gt; /root/content[Category =
                                                       'Special Exhibitions']/Priority)]
                      [1]">
1 голос
/ 18 июня 2011

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

<xsl:for-each select="root/content">
      <xsl:sort data-type="number" order="ascending" select="Priority"/>
      <xsl:if test="(Category='Special Exhibitions')">
        <xsl:choose>
          <xsl:when test="(position()=1)">

до

<xsl:for-each select="root/content[Category='Special Exhibitions']">
      <xsl:sort data-type="number" order="ascending" select="Priority"/>
      <xsl:if test="position()=1">

Я говорю это потому, что вы хотите обработать "первый узел с <Category=Special Exhibition>, упорядоченным по <Priority>" , тогда как вы обрабатываете * первый (корневой / контентный) узел, упорядоченный по <Priority>, , если этот узел имеет <Category>=Special Exhibition.

В случае, если контент с самым низким приоритетом не относится к категории «Специальная выставка», ваш исходный код ничего не выдаст. Конечно, дело обстоит не так с примером ввода, который вы показали. Но так как вы не сказали нам, каков фактический результат для этого образца, это мое лучшее предположение на основе доступных данных.

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