2013-09-03 3 views
0

Например, как бы я превратить это:Как автоматически генерировать уровни заголовков XHTML с помощью XSLT 1.0

<chapter name="Chapter 1"> 
    <chapter name="Chapter 1.1"> 
    <chapter name="Chapter 1.1.1"> 
     <chapter name="Chapter 1.1.1.1"/> 
    </chapter> 
    <chapter name="Chapter 1.1.2"/> 
    </chapter> 
    <chapter name="Chapter 1.2"/> 
</chapter> 

в этом:

<h1>Chapter 1</h1> 
<h2>Chapter 1.1</h2> 
<h3>Chapter 1.1.1</h3> 
<h4>Chapter 1.1.1.1</h4> 
<h3>Chapter 1.1.2</h3> 
<h2>Chapter 1.2</h2> 

Спасибо!

+0

Какое исследование вы сделали и что вы пробовали до сих пор? –

+0

Я очень новичок в XSLT. Я пробовал несколько вещей, но всегда получаю то, что я считаю «жестко закодированными» решениями. Я думал, что поставил бы вопрос в чистом виде, не загрязняя его своими (возможно, неправильными) идеями. –

ответ

3

Может быть несколько возможностей, как это сделать. Это зависит от того, что сигнализирует уровень заголовка (номер в @name атрибут? Глубина chapter элемент?).

Я полагаю, что это глубина chapter. Таким образом, для ввода XML

<?xml version="1.0" encoding="UTF-8"?> 
<chapter name="Chapter 1"> 
    <chapter name="Chapter 1.1"> 
     <chapter name="Chapter 1.1.1"> 
      <chapter name="Chapter 1.1.1.1"/> 
     </chapter> 
     <chapter name="Chapter 1.1.2"/> 
    </chapter> 
    <chapter name="Chapter 1.2"/> 
</chapter> 

вы могли бы использовать шаблон с параметром увеличения в последовательном вызове apply-templates

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="html" version="1.0" encoding="UTF-8" indent="yes"/> 

    <xsl:template match="/"> 
     <html> 
      <head> 
       <title>xxx</title> 
      </head> 
      <body> 
       <xsl:apply-templates select="chapter" /> 
      </body> 
     </html> 
    </xsl:template> 

    <xsl:template match="chapter"> 
     <xsl:param name="level" select="1" /> 

     <xsl:element name="h{$level}"> 
      <xsl:value-of select="@name" /> 
     </xsl:element> 

     <xsl:apply-templates select="chapter"> 
      <!-- Increase level of heading --> 
      <xsl:with-param name="level" select="$level+1" /> 
     </xsl:apply-templates> 

    </xsl:template> 

</xsl:stylesheet> 

, который производит следующий вывод

<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
     <title>xxx</title> 
    </head> 
    <body> 
     <h1>Chapter 1</h1> 
     <h2>Chapter 1.1</h2> 
     <h3>Chapter 1.1.1</h3> 
     <h4>Chapter 1.1.1.1</h4> 
     <h3>Chapter 1.1.2</h3> 
     <h2>Chapter 1.2</h2> 
    </body> 
</html> 

Edit: еще одна идеи может быть подсчитать количество Элемент главы "parent", подобный этому

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="html" version="1.0" encoding="UTF-8" indent="yes"/> 

    <xsl:template match="/"> 
     <html> 
      <head> 
       <title>xxx</title> 
      </head> 
      <body> 
       <xsl:apply-templates select="//chapter" /> 
      </body> 
     </html> 
    </xsl:template> 

    <xsl:template match="chapter"> 
     <xsl:variable name="level" select="count(ancestor-or-self::chapter)" /> 
     <xsl:element name="h{$level}"> 
      <xsl:value-of select="@name" /> 
     </xsl:element> 
    </xsl:template> 

</xsl:stylesheet> 
+0

Подсчет количества родителей - изящное решение. Благодарю. –

Смежные вопросы