следующий брат для элемента списка - PullRequest
0 голосов
/ 23 октября 2018

Я хотел бы создать элемент списка, и формат правильный, как есть.Тем не менее, я хотел бы добавить строку ' или ' к альтернативам.Мой элемент управления XPath не работает должным образом.Если у меня есть List и базовый SmallList, функция игнорируется.Если списка нет, все работает как нужно.Тем не менее, я не прихожу к правильному выражению, я надеюсь, что вы можете мне помочь.Я использую XSLT 1.0.Я надеюсь, что пример понятен.

XML:

<University>
    <Class>
        <Student>John Doe</Student>
        <List>
            <SmallList>
                <Student>Jane Doe</Student>
            </SmallList>
        </List>
    </Class>
    <AlternativeClass>
        <Class>
            <Student>Richard Roe</Student>
        </Class>
    </AlternativeClass>
</University>

Как должен выглядеть результат:

<div>
   <p data-role="heading">University-Heading</p>
   <ul>
      <li>John Doe
         <ul>
            <li>Jane Doe</li>
         </ul>
      </li>
      <li class="parablock bold_">or</li>
      <li>Richard Roe</li>
   </ul>
</div>

Как я уже говорил, отсутствует <li class="parablock bold_>or<li>.Если я хочу удалить List -Блок, результат будет выглядеть как положено (например, Джейн Доу в этом примере).

<div>
   <p data-role="heading">University-Heading</p>
   <ul>
      <li>John Doe</li>
      <li class="parablock bold_">or</li>
      <li>Richard Roe</li>
   </ul>
</div>

Конструкция для следующего-одноуровневого элемента должна выглядеть следующим образом (follow-sibling)BBB должен быть XXX):

<AAA>
    <BBB>
        <CCC/>
    </BBB>
    <XXX>
        <DDD/>
        <EEE/>
    </XXX>
</AAA>

Мой XSLT выглядит следующим образом:

<xsl:template match="University">
    <div>
        <!-- HEADING FOR UNIVERSITY -->
        <p data-role="heading">
            <xsl:text>University-Heading</xsl:text>
        </p>
        <ul>
            <xsl:apply-templates/>
        </ul>
    </div>
</xsl:template>
<!-- CLASS -->
<xsl:template match="Class">
    <xsl:apply-templates/>
    <!-- 'OR' BEFORE ALTERNATIVE CLASS -->
    <!-- I GUESS THAT THE MISTAKE IS IN HERE -->
    <xsl:if test="following-sibling::*[1][self::AlternativeClass]">
        <li class="parablock bold_">
            <xsl:text>or</xsl:text>
        </li>
    </xsl:if>
</xsl:template>
<!-- CLASS-NODE WITH LIST -->
<xsl:template match="Class[List]">
    <xsl:apply-templates select="Student"/>
</xsl:template>
<!-- ALTERNATIVECLASS -->
<xsl:template match="AlternativeClass">
    <xsl:apply-templates/>
</xsl:template>
<!-- STUDENT IN CLASS AND SMALLLIST -->
<xsl:template match="SmallList/Student | Class/Student">
    <li>
        <xsl:if test="name(preceding-sibling::*[1]) = 'Para'">
            <xsl:attribute name="class">parablock</xsl:attribute>
        </xsl:if>
        <xsl:apply-templates/>
        <xsl:apply-templates select="following-sibling::*[1][self::List]"/>
    </li>
</xsl:template>
<!-- LIST -->
<xsl:template match="List">
    <ul>
        <xsl:apply-templates/>
    </ul>
</xsl:template>
<!-- SMALLLIST -->
<xsl:template match="SmallList">
    <xsl:apply-templates/>
</xsl:template>

.NET XSLT Fiddle: https://xsltfiddle.liberty -development.net / bdxtqV

1 Ответ

0 голосов
/ 23 октября 2018

Ваше утверждение для следующего брата действительно верно.Проблема в том, что Class, который имеет следующий AlternativeClass, также имеет дочерний элемент List, что означает, что он соответствует этому шаблону (поскольку у него есть дополнительное условие, шаблон получает более высокий приоритет)

<xsl:template match="Class[List]">
    <xsl:apply-templates select="Student"/>
</xsl:template>

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

Вы также можете просто добавить условие в этот оператор

<xsl:template match="Class[List]">
    <xsl:apply-templates select="Student"/>
    <xsl:if test="following-sibling::*[1][self::AlternativeClass]">
        <li class="parablock bold_">
            <xsl:text>or</xsl:text>
        </li>
    </xsl:if>
</xsl:template>

Хотя это немного дублирует код, поэтому вы можете поместить эту логику в именованный шаблон, или, возможно, вы можете объединить два шаблона "Class" в один ...

<xsl:template match="Class">
    <xsl:choose>
        <xsl:when test="List">
            <xsl:apply-templates select="Student"/>
        </xsl:when>
        <xsl:otherwise>
            <xsl:apply-templates />
        </xsl:otherwise>
    </xsl:choose>
    <xsl:if test="following-sibling::*[1][self::AlternativeClass]">
        <li class="parablock bold_">
            <xsl:text>or</xsl:text>
        </li>
    </xsl:if>
</xsl:template>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...