Преобразование простого текста в списки стилей html с использованием xstl или группирование элементов в соответствии с их содержимым и позициями с использованием xslt - PullRequest
2 голосов
/ 28 октября 2010

Пытаясь преобразовать простой текстовый документ в HTML-документ, используя xslt, я борюсь с неупорядоченными списками.

У меня есть:

<item>some text</item>
<item>- a list item</item>
<item>- another list item</item>
<item>more plain text</item>
<item>more and more plain text</item>
<item>- yet another list item</item>
<item>even more plain text</item>

Что я хочу:

<p>some text</p>
<ul>
    <li>a list item</li>
    <li>another list item</li>
</ul>
<p>more plain text</p>
<p>more and more plain text</p>
<ul>
    <li>yet another list item</li>
</ul>
<p>even more plain text</p>

Я смотрел на мюнхенскую группировку, но она объединила бы все элементы списка в одну группу и все элементы простого текста в другую. Затем я попытался сделать выбор только тех элементов, чьи предшествующие элементы первого символа отличаются от его первого символа. Но когда я пытаюсь все объединить, я все равно получаю все ли в одной ул.

У вас есть намеки на меня?

Ответы [ 2 ]

2 голосов
/ 28 октября 2010

Это преобразование :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:key name="kFollowing"
   match="item[contains(., 'list')]
          [preceding-sibling::item[1][contains(.,'list')]]"
   use="generate-id(preceding-sibling::item
                      [not(contains(.,'list'))]
                      [1]
                        /following-sibling::item[1]
                      )"/>

 <xsl:template match="item[contains(.,'list')]
              [preceding-sibling::item[1][not(contains(.,'list'))]]">

  <ul>
   <xsl:apply-templates mode="list"
        select=".|key('kFollowing',generate-id())"/>
  </ul>
 </xsl:template>

 <xsl:template match="item" mode="list">
  <li><xsl:value-of select="."/></li>
 </xsl:template>

 <xsl:template match="item[not(contains(.,'list'))]">
  <p><xsl:value-of select="."/></p>
 </xsl:template>

 <xsl:template match="item[contains(.,'list')]
              [preceding-sibling::item[1][contains(.,'list')]]"/>
</xsl:stylesheet>

при применении к предоставленному XML-документу (исправлено из сильно искаженного в правильно сформированный XML-документ):

<t>
 <item>some text</item>
 <item>- a list item</item>
 <item>- another list item</item>
 <item>more plain text</item>
 <item>more and more plain text</item>
 <item>- yet another list item</item>
 <item>even more plain text</item>
</t>

дает желаемый, правильный результат :

<p>some text</p>
<ul>
   <li>- a list item</li>
   <li>- another list item</li>
</ul>
<p>more plain text</p>
<p>more and more plain text</p>
<ul>
   <li>- yet another list item</li>
</ul>
<p>even more plain text</p>
1 голос
/ 28 октября 2010

Эта таблица стилей:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>
    <xsl:template match="node()">
        <xsl:apply-templates select="node()[1]|following-sibling::node()[1]"/>
    </xsl:template>
    <xsl:template match="item">
        <p>
            <xsl:value-of select="."/>
        </p>
        <xsl:apply-templates select="following-sibling::node()[1]"/>
    </xsl:template>
    <xsl:template match="item[starts-with(.,'- ')]">
        <ul>
            <xsl:call-template name="open"/>
        </ul>
        <xsl:apply-templates
             select="following-sibling::node()
                        [not(self::item[starts-with(.,'- ')])][1]"/>
    </xsl:template>
    <xsl:template match="node()" mode="open"/>
    <xsl:template match="item[starts-with(.,'- ')]" mode="open" name="open">
        <li>
            <xsl:value-of select="substring-after(.,'- ')"/>
        </li>
        <xsl:apply-templates select="following-sibling::node()[1]" mode="open"/>
    </xsl:template>
</xsl:stylesheet>

Выход:

<p>some text</p>
<ul>
    <li>a list item</li>
    <li>another list item</li>
</ul>
<p>more plain text</p>
<p>more and more plain text</p>
<ul>
    <li>yet another list item</li>
</ul>
<p>even more plain text</p>

Примечание : Это похоже на перенос смежных файлов. Использование мелкозернистого обхода.

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