XSLT1: преобразовать узлы XML в список HTML, начиная сначала с самого глубокого узла - PullRequest
2 голосов
/ 12 мая 2011

у меня это ниже xml

 <root>
        <s>
            <name>self-1</name>
            <parents>
                <s>
                    <name>p-1-2</name>
                    <parents>
                        <s>
                            <name>p-1-2-1</name>
                            <parents>
                                <s>
                                    <name>p-1-2-1-1</name>
                                </s>
                            </parents>
                        </s>
                        <s>
                            <name>p-1-2-2</name>
                        </s>
                    </parents>
                </s>
            </parents>
        </s>
    </root>

и мне нужно написать xslt1 для синтаксического анализа этого xml для получения вывода, как показано ниже, цель состоит в том, чтобы сначала обработать все родительские узлы и, наконец, узел self-1. Пожалуйста, дайте мне несколько советов.

<ul>
    <li>p-1-2-1-1</li>
    <ul>
        <li>p-1-2-1</li>
        <li>p-1-2-2</li>
        <ul>
            <li>p-1-2</li>
            <ul>
                <!-- self -->
                <li>self-1</li>
            </ul>
        </ul>
    </ul>
</ul>

Ответы [ 2 ]

1 голос
/ 12 мая 2011

Вот мое предложение о том, как решить эту проблему:

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="1.0">

  <xsl:output method="html" indent="yes"/>

  <xsl:template match="/">
    <xsl:apply-templates select="descendant::parents[not(s/parents)]"/>
  </xsl:template>

  <xsl:template match="parents | root">
    <ul>
      <xsl:apply-templates select="s/name"/>
      <xsl:variable name="p" select="parent::s/parent::parents | parent::s/parent::root"/>
      <xsl:if test="$p">
        <li>
          <xsl:apply-templates select="$p"/>
        </li>
      </xsl:if>
    </ul>
  </xsl:template>

  <xsl:template match="name">
    <li>
      <xsl:value-of select="."/>
    </li>
  </xsl:template>

</xsl:stylesheet>

Это выводит

<ul>
   <li>p-1-2-1-1</li>
   <li>
      <ul>
         <li>p-1-2-1</li>
         <li>p-1-2-2</li>
         <li>
            <ul>
               <li>p-1-2</li>
               <li>
                  <ul>
                     <li>self-1</li>
                  </ul>
               </li>
            </ul>
         </li>
      </ul>
   </li>
</ul>

Это не совсем то, что вы просили, но это сделано намеренно: ваш примеримел ul элементов с ul дочерними элементами, но это недопустимо в HTML (http://www.w3.org/TR/html4/struct/lists.html#h-10.2). Так что моя таблица стилей гарантирует, что результат является действительным HTML, следя за тем, чтобы любые ul имели только li дочерних элементов.

0 голосов
/ 12 мая 2011

для обработки нескольких узлов <s>

Я обновил шаблон <xsl:template match="parents | root"> примерно так:

 <xsl:template match="parents | root">
        <ul>
            <xsl:apply-templates select="s/name"/>
            <xsl:choose>
                <xsl:when test="parent::s/parent::parents">
                    <xsl:variable name="p" select="parent::s/parent::parents"/>
                    <li><xsl:apply-templates select="$p"/></li>
                </xsl:when>

                <xsl:when test="parent::s/parent::root">
                    <xsl:variable name="p" select="parent::s/parent::root"/>
                    <li><xsl:apply-templates select="$p"/></li>
                </xsl:when>
            </xsl:choose>
        </ul>
    </xsl:template>
...