Редизайн <li>-элемента - PullRequest
       4

Редизайн <li>-элемента

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

Я бы хотел включить <ul> -элемент в <li> -элемент, но я не знаю, как это сделать.Я попытался описать проблему простым и понятным способом.Я подозреваю, что это только небольшое место, которое должно быть адаптировано.Я использую XSLT 1.0.

Вот этот XML:

<University>
    <Student>
        <Info>Example 1.0</Info>
        <Details>
            <Entry>
                <Info>Example 1.1</Info>
            </Entry>
            <Entry>
                <Info>Example 1.2</Info>
            </Entry>
        </Details>
    </Student>
    <Student>
        <Info>Example 2.0</Info>
    </Student>
    <Student>
        <Info>Example 3.0</Info>
    </Student>
</University>

То, что я хочу, должно выглядеть так:

<div>
    <p data-role="heading">UNIVERSITY</p>
    <ul>
        <li>Example 1.0
            <ul>
                <li>Example 1.1</li>
                <li>Example 1.2</li>
            </ul>
        </li>
        <li>Example 2.0</li>
        <li>Example 3.0</li>
    </ul>
</div>

Что я получаю в данный моментэто следующий код:

<div>
    <p data-role="heading">UNIVERSITY</p>
    <ul>
        <li>Example 1.0</li>
        <ul>
            <li>Example 1.1</li>
            <li>Example 1.2</li>
        </ul>
        <li>Example 2.0</li>
        <li>Example 3.0</li>
    </ul>
</div>

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

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" 
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
                xmlns:nxps="urn:nxps"
                exclude-result-prefixes="nxps">
  <xsl:strip-space elements="*"/>
  <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
  <!-- UNIVERSITY -->
    <xsl:template match="University">
        <div>
            <!-- HEADING -->
            <p data-role="heading">
                <xsl:text>UNIVERSITY</xsl:text>
            </p>
            <ul>
                <xsl:apply-templates/>
            </ul>
        </div>
    </xsl:template>
    <!-- STUDENT -->
    <xsl:template match="Student">
        <xsl:apply-templates/>
    </xsl:template>
    <!-- INFO IN STUDENT & ENTRY -->
    <xsl:template match="Entry/Info | Student/Info">
        <xsl:choose>
            <!-- FIRST INFO -->
            <xsl:when test="name(preceding-sibling::*[1])!='Info'">
                <li>
                    <xsl:apply-templates/>
                </li>
            </xsl:when>
            <!-- FOLLOWING INFO -->
            <xsl:otherwise>
                <li class="Parablock">
                    <xsl:apply-templates/>
                </li>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
    <!-- DETAILS -->
    <xsl:template match="Details">
        <ul>
            <xsl:apply-templates/>
        </ul>
    </xsl:template>
    <!-- ENTRY -->
    <xsl:template match="Entry">
        <xsl:apply-templates/>
    </xsl:template>
</xsl:stylesheet>

Вот также ссылка на .NET XSLT Fiddle: https://xsltfiddle.liberty -development.net / eiZQaG5 / 1

Спасибо за помощь!

1 Ответ

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

Я думаю, вам нужен шаблон, который соответствует Student узлам, у которых есть дочерний Details узел

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

Затем в вашем шаблоне, соответствующем Student/Info, вы можете выбрать любой следующий Details узелтак что он выводится как вложенный элемент в li

<xsl:apply-templates select="following-sibling::*[1][self::Details]" />

Попробуйте этот XSLT, в котором я также упростил шаблон Student/Info:

<xsl:stylesheet version="1.0" 
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
                xmlns:nxps="urn:nxps"
                exclude-result-prefixes="nxps">

    <xsl:strip-space elements="*"/>

    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

    <!-- UNIVERSITY -->
    <xsl:template match="University">
        <div>
            <!-- HEADING -->
            <p data-role="heading">
                <xsl:text>UNIVERSITY</xsl:text>
            </p>
            <ul>
                <xsl:apply-templates/>
            </ul>
        </div>
    </xsl:template>

    <!-- STUDENT -->
    <xsl:template match="Student">
        <xsl:apply-templates/>
    </xsl:template>

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

    <!-- INFO IN STUDENT & ENTRY -->
    <xsl:template match="Entry/Info | Student/Info">
        <li>
            <xsl:if test="name(preceding-sibling::*[1]) = 'Info'">
                <xsl:attribute name="class">Parablok</xsl:attribute>
            </xsl:if>
            <xsl:apply-templates/>
            <xsl:apply-templates select="following-sibling::*[1][self::Details]" />
        </li>
    </xsl:template>

    <!-- DETAILS -->
    <xsl:template match="Details">
        <ul>
            <xsl:apply-templates/>
        </ul>
    </xsl:template>

    <!-- ENTRY -->
    <xsl:template match="Entry">
        <xsl:apply-templates/>
    </xsl:template>
</xsl:stylesheet>

Обратите вниманиеможет на самом деле удалить шаблоны "Student" и "Entry", потому что встроенные шаблоны XSLT в этом случае будут делать то же самое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...