Можно ли упростить этот xpath? - PullRequest
0 голосов
/ 23 марта 2019

У меня есть этот код:

<!--Display the name of the brother assigned-->
<xsl:template match="Name | PrayerOpen | PrayerEnd">
  <td class="cellName">
    <xsl:choose>
      <xsl:when test="//MeetingWorkBook/Settings/ForeignGroupMode='1' and (
                 ../@BookmarkId='2' or ../../@BookmarkId='2' or 
                 ../../../@BookmarkId='2'or ../../../../@BookmarkId='2' or 
                 ../@BookmarkId='4' or ../../@BookmarkId='4' or 
                 ../../../@BookmarkId='4' or ../../../../@BookmarkId='4' or 
                 self::PrayerOpen or self::PrayerEnd)">
        <em><xsl:value-of select ="//Labels/MainHall"/></em>
      </xsl:when>
      <xsl:when test="//MeetingWorkBook/Settings/ForeignGroupMode='1' and .='' and self::Name">
        <em><xsl:value-of select ="//Labels/MainHall"/></em>
      </xsl:when>
      <xsl:when test="@Duplicate=1">
        <span class="textDuplicate">
          <xsl:value-of select="."/>
        </span>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="."/>
      </xsl:otherwise>
    </xsl:choose>
  </td>
</xsl:template>

Работает нормально. У меня есть ряд путей, чтобы я мог найти правильный узел с атрибутом BookmarkId. Можно ли упростить этот код?

По сути, исходя из контекста текущего узла, я хочу пройтись по родителям, пока он не достигнет узла Meeting, который является атрибутом.

Пример XML

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="Workbook-S-140-PublicTalk-WatchtowerStudy-ServiceTalk-FGroup-v2.xsl"?>
<MeetingWorkBook>
    <Meeting BookmarkId="0" PageBreak="0" NumberClasses="1" SpecialEvent="0">
        <PrayerOpen>Name 1</PrayerOpen>
        <TFGW NumberClasses="1">
            <TFGWItem>
                <Name>Name 2</Name>
            </TFGWItem>
            <TFGWItem>
                <Name>Name 3</Name>
            </TFGWItem>
        </TFGW>
        <AYFM NumberClasses="1">
            <Teaching>
                <Name>Name 4</Name>
            </Teaching>
        </AYFM>
        <LAC CircuitVisit="0">
            <LACItem>
                <Name>Name 5</Name>
            </LACItem>
            <PrayerEnd>Name 6</PrayerEnd>
        </LAC>
    </Meeting>
</MeetingWorkBook>

1 Ответ

0 голосов
/ 24 марта 2019

Основываясь на совете в комментариях, я в итоге использовал вызов ancestor.Поэтому мой шаблон теперь выглядит так:

  <!--Display the name of the brother assigned-->
  <xsl:template match="Name | PrayerOpen | PrayerEnd">
    <td class="cellName">
      <xsl:choose>
        <xsl:when test="//MeetingWorkBook/Settings/ForeignGroupMode='1' and (
                        ancestor::Meeting[@BookmarkId='2'] or 
                        ancestor::Meeting[@BookmarkId='4'] or self::PrayerOpen or self::PrayerEnd)">
          <em><xsl:value-of select ="//Labels/MainHall"/></em>
        </xsl:when>
        <xsl:when test="//MeetingWorkBook/Settings/ForeignGroupMode='1' and .='' and self::Name">
          <em><xsl:value-of select ="//Labels/MainHall"/></em>
        </xsl:when>
        <xsl:when test="@Duplicate=1">
          <span class="textDuplicate">
            <xsl:value-of select="."/>
          </span>
        </xsl:when>
        <xsl:otherwise>
          <xsl:value-of select="."/>
        </xsl:otherwise>
      </xsl:choose>
    </td>
  </xsl:template>
...