Элементы вложенного списка XSLT - PullRequest
4 голосов
/ 28 августа 2011

Я новичок в xslt, я пытаюсь справиться с ситуацией, когда я вложил неупорядоченные или упорядоченные элементы списка например:

*  Dresses
          # Formal
                -  Men
                -  Women
                - Children
          # Casual
     *  FootWear
     *  Other Accessories

В основном элементы списка вложены друг в друга, но мы можем вкладывать их настолько глубоко, насколько это возможно. Можете ли вы дать мне общее представление о том, как этого добиться ..

Эдит говорит: Спасибо за ваш быстрый ответ. Вот мой xml:

<?xml version="1.0" encoding="utf-8"?>
<emailmessage>
    <ul>
        <li>Dresses</li>
        <ul>
            <li>Professional</li>
            <ul>
                <li>Mens</li>
                <li>Womens</li>
            </ul>
            <li>Causual </li>
        </ul>
        <li>FootWear</li>
        <li>Other Accessories</li>
    </ul>
</emailmessage>

Это мой xml в формате html, формат, который я хочу получить в виде обычного текста, т. Е.

  • Одна вкладка и *, если <li> без какого-либо предка
  • две вкладки и #, если его подсписок первых один, т.е. один имеет одного предка
  • три вкладки с -, если его подсписок подсписка, т.е. имеет двух предков.

И формат повторяется ..

* Dresses
    # Formal
        - Men
        - Women
        - Children
    # Casual
* FootWear
* Other Accessories

Ответы [ 3 ]

3 голосов
/ 29 августа 2011

Это преобразование работает с любым уровнем вложенности, вплоть до 20 :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>
 <xsl:strip-space elements="*"/>

 <xsl:variable name="vIndent"
  select="'&#10;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;'"/>

 <xsl:template match="li">
  <xsl:value-of select=
   "concat(substring($vIndent,1, count(ancestor::ul)+1),.)"/>
 </xsl:template>
</xsl:stylesheet>

при применении к предоставленному документу XML :

<emailmessage>
    <ul>
        <li>* Dresses</li>
        <ul>
            <li># Professional</li>
            <ul>
                <li>- Mens</li>
                <li>- Womens</li>
            </ul>
            <li># Causual </li>
        </ul>
        <li>* FootWear</li>
        <li>* Other Accessories</li>
    </ul>
</emailmessage>

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

* Dresses
    # Professional
        - Mens
        - Womens
    # Causual 
* FootWear
* Other Accessories

Обновление : неограничено вложение :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="li">
  <xsl:text>&#10;</xsl:text>
  <xsl:for-each select="ancestor::ul"><xsl:text>&#9;</xsl:text></xsl:for-each>
  <xsl:value-of select="."/>
 </xsl:template>
</xsl:stylesheet>

Update2 : OP указал, что маркирующие символы (*, * и -) отсутствуют в документе XML.Вот решение, которое работает с неограниченным вложением:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>
 <xsl:strip-space elements="*"/>

 <xsl:variable name="vDelims" select="'- * # '"/>

 <xsl:template match="li">
  <xsl:text>&#10;</xsl:text>
  <xsl:for-each select="ancestor::ul"><xsl:text>&#9;</xsl:text></xsl:for-each>
  <xsl:value-of select=
   "substring($vDelims,
              2*(1+count(ancestor::ul) mod 3) -1,
              2)"/>
  <xsl:value-of select="."/>
 </xsl:template>
</xsl:stylesheet>

При применении к предоставленному XML-документу (как указано выше, но с удаленными маркерами) :

<emailmessage>
    <ul>
        <li>Dresses</li>
        <ul>
            <li>Professional</li>
            <ul>
                <li>Mens</li>
                <li>Womens</li>
            </ul>
            <li>Causual </li>
        </ul>
        <li>FootWear</li>
        <li>Other Accessories</li>
    </ul>
</emailmessage>

получается тот же, желаемый и правильный результат :

* Dresses
    # Professional
        - Mens
        - Womens
    # Causual 
* FootWear
* Other Accessories
2 голосов
/ 28 августа 2011

Подсчитайте ul предков при сопоставлении с шаблоном (обратите внимание, что первому это не нужно). Это преобразование должно дать вам хорошую отправную точку:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="emailmessage/ul/li">
        <xsl:value-of select="concat('&#09;*',.,'&#xA;')"/>
    </xsl:template>

    <xsl:template match="li[count(ancestor::ul)=2]">
        <xsl:value-of select="concat('&#09;&#09;#',.,'&#xA;')"/>
    </xsl:template>

    <xsl:template match="li[count(ancestor::ul)=3]">
        <xsl:value-of select="concat('&#09;&#09;'&#09;-',.,'&#xA;')"/>
    </xsl:template>

</xsl:stylesheet>

производит:

* Dresses
    # Professional
        - Mens
        - Womens
    # Causual 
* FootWear
* Other Accessories
0 голосов
/ 28 августа 2011

Может быть этот пример может быть полезным?Он показывает, как построить древовидную навигацию для веб-сайта с XSLT.

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