将模板应用于同级元素具有特定属性值的元素
Applying templates to an element whose sibling element has a certain attribute value
我正在尝试使用 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]
为真时应用模板。
我知道我可以先用 if
子句包装我的 apply-templates
调用,这样就可以了(见下文)。
我知道我可以改进 Event
模板的逻辑来测试同级元素属性的值。
我有很多使用特定 Event
属性的模板,并且更喜欢 select 项目 Event
的功能,其中它的兄弟元素 Date
具有特定的属性值。
但是我的尝试没有用。我看到了这个 answer 并尝试了:
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
的 child 而是 兄弟 .
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>
您应该能够将谓词添加到 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>
我正在尝试使用 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]
为真时应用模板。
我知道我可以先用
if
子句包装我的apply-templates
调用,这样就可以了(见下文)。我知道我可以改进
Event
模板的逻辑来测试同级元素属性的值。
我有很多使用特定 Event
属性的模板,并且更喜欢 select 项目 Event
的功能,其中它的兄弟元素 Date
具有特定的属性值。
但是我的尝试没有用。我看到了这个 answer 并尝试了:
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
的 child 而是 兄弟 .
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>
您应该能够将谓词添加到 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>