首页 > 解决方案 > 将模板应用于其兄弟元素具有特定属性值的元素

问题描述

我正在尝试使用 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元素存在且兄弟 Date[@AllDayEvent]为真时应用模板。

我有很多使用特定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的孩子。

那么是否可以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>

标签: xslt-1.0

解决方案


您应该能够将谓词添加到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>

推荐阅读