重新设计<li>元素

时间:2018-10-22 07:57:43

标签: html xml xslt

我想在<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小提琴的链接:https://xsltfiddle.liberty-development.net/eiZQaG5/1

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

我认为您需要一个模板,该模板匹配具有子arrayValue.sort((a, b) => ...) 节点的Student个节点

Details

然后,在与<xsl:template match="Student[Details]"> <xsl:apply-templates select="Info" /> </xsl:template> 匹配的模板中,您可以选择以下任何一个Student/Info节点,以便将其作为嵌套元素输出到Details

li

尝试使用此XSLT,其中我还简化了<xsl:apply-templates select="following-sibling::*[1][self::Details]" /> 模板:

Student/Info

请注意,实际上您可以删除“学生”和“条目”模板,因为在这种情况下XSLT的内置模板会做完全相同的事情。