Применение шаблонов к элементу, чей родной элемент имеет определенное значение атрибута - PullRequest
1 голос
/ 19 февраля 2020

Я пытаюсь применить шаблон, используя XSLT1, и я не могу заставить его работать:

<xsl:apply-templates select="MeetingWorkBook/Meeting[1]/SpecialEvent/Event[/Date[@AllDayEvent='1']]" mode="FirstRow_Pray">
    <xsl:with-param name="strClass">cellBold borderRight</xsl:with-param>
</xsl:apply-templates>

Я пытаюсь применить этот шаблон:

  <!--This is used to insert the Chairman, or Special Event-->
  <xsl:template match="Chairman | Event" mode="FirstRow_Pray">
    <xsl:param name="strClass"/>
    <td class="{$strClass}">
      <xsl:if test="self::Event">
        <xsl:attribute name="rowspan">2</xsl:attribute>
      </xsl:if>
      <xsl:value-of select="."/>
    </td>
  </xsl:template>

Но я Я хочу применить шаблон только в том случае, если элемент Event существует и sibling Date[@AllDayEvent] имеет значение true.

  • Я знаю, что могу завершить свой вызов apply-templates сначала с предложением if, и это сработало бы (см. ниже).

  • Я знаю, что могу улучшить logi c шаблона Event, чтобы проверить значение родственного брата атрибут элементов.

У меня есть много шаблонов для использования определенных c Event свойств, и я предпочел бы возможность выбрать элемент Event, где его родственный элемент Date имеет определенный значение атрибута.

Но моя попытка не работает. Я видел этот ответ и пытался:

MeetingWorkBook/Meeting[1]/SpecialEvent/Event[Date[@AllDayEvent='1']]

Но он все равно не работает.


Это будет работать:

  <xsl:if test="MeetingWorkBook/Meeting[1]/SpecialEvent/Date[@AllDayEvent='1']">
    <xsl:apply-templates select="MeetingWorkBook/Meeting[1]/SpecialEvent/Event" mode="FirstRow_Pray">
      <xsl:with-param name="strClass">cellBold borderRight</xsl:with-param>
    </xsl:apply-templates>
  </xsl:if>

Но я хочу избегать необходимости if, если это возможно.

Теперь я вижу, что не так с моей первоначальной попыткой. Date не ребенок Event, а брат .

  • MeetingWorkBook/Meeting[1]/SpecialEvent/Date
  • MeetingWorkBook/Meeting[1]/SpecialEvent/Event

Так можно ли применить шаблон к Event, где у брата Date есть атрибут AllDayEvent со значением 1. Или у меня нет выбора, кроме как использовать if подход?

Образец XML данных:

<Meeting BookmarkId="2" PageBreak="0" NumberClasses="1" SpecialEvent="1" CircuitVisit="0">
    <Date ThisWeek="W20200217" NextWeek="W20200224">February 17-23</Date>
    <WeeklyBibleReading>GENESIS 18-19</WeeklyBibleReading>
    <ReviewQuestion></ReviewQuestion>
    <SpecialEvent>
        <Event>Circuit Assembly - Love Jehovah With All Your Heart</Event>
        <Location>Bristol Assembly Hall, Hortham Lane, Bristol, BS32 4JH</Location>
        <Date Day="23" DayShort="Sun" DayFull="Sunday" Month="2" MonthShort="Feb" MonthFull="February" Year="2020" Memorial="0" AllDayEvent="1" MidweekEvent="1">23/02/2020</Date>
    </SpecialEvent>
</Meeting>

1 Ответ

1 голос
/ 19 февраля 2020

Вы должны иметь возможность добавить предикат к SpecialEvent вместо Event ...

<xsl:apply-templates select="MeetingWorkBook/Meeting[1]/SpecialEvent[Date/@AllDayEvent='1']/Event" mode="FirstRow_Pray">
    <xsl:with-param name="strClass">cellBold borderRight</xsl:with-param>
</xsl:apply-templates>
...