Вложенный список с числовыми метками - PullRequest
2 голосов
/ 02 сентября 2011

У меня есть вложенный список, и поэтому я хочу, чтобы ярлык тоже был вложенным.

Это мой код:

<!-- For first list -->
<xsl:template name="list1-label">
    <xsl:number format="1."/>
</xsl:template>

<!-- The nestled list -->
<xsl:template name="list2-label">
    <xsl:number format="1.1."/>
</xsl:template>

Первое число в последнем шаблоне ( 1 .1.) В этом случае я хочу относиться к родительскому элементу;«3».

Вот структура xml:

<list1>
  <item>Test</item>
  <item>Test</item>
  <list2>
    <item>Test</item>
    <item>Test</item>
  </list2>
  <item>Test</item>
</list1>

Вот вывод:

1. Test
2. Test
    2.1. Test
    2.2. Test
3. Test

Ответы [ 3 ]

1 голос
/ 05 сентября 2011

Требуемый вывод можно получить (например), применяя расширенные атрибуты @ из и @ count из xsl:number.Вот рабочий пример, с которого вы должны начать:

<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="list1/item">  
        <xsl:number level="any" from="list1" count="list1/item"/>
        <xsl:text>. </xsl:text>
        <xsl:value-of select="."/>
        <xsl:text>&#10;</xsl:text>
    </xsl:template>

    <xsl:template match="list1/list2/item">
        <xsl:text>&#09;</xsl:text>
        <xsl:number level="any" from="list1" count="list1/item"/>
        <xsl:text>.</xsl:text>
        <xsl:number level="any" from="list2" count="list2/item"/>
        <xsl:text>. </xsl:text>
        <xsl:value-of select="."/>
        <xsl:text>&#10;</xsl:text>
    </xsl:template>

</xsl:stylesheet>

Если вы хотите упростить шаблоны соответствия:

<xsl:template match="list1">
    <xsl:apply-templates />
</xsl:template>

<xsl:template match="list1/item">  
    <xsl:number level="any" from="list1" count="list1/item"/>
    <xsl:text>. </xsl:text>
    <xsl:value-of select="."/>
    <xsl:text>&#10;</xsl:text>
</xsl:template>

<xsl:template match="list2/item">
    <xsl:text>&#09;</xsl:text>
    <xsl:number level="any" from="list1" count="list1/item"/>
    <xsl:text>.</xsl:text>
    <xsl:number level="any" from="list2" count="list2/item"/>
    <xsl:text>. </xsl:text>
    <xsl:value-of select="."/>
    <xsl:text>&#10;</xsl:text>
</xsl:template>

Этот последний пример правильно подтолкнет вас к дальнейшемууровни вложенности как у list3 .

1 голос
/ 05 сентября 2011

Это новое преобразование обобщено для обработки переменного числа списков.

Пример ввода:

<list1>
  <item>Test</item>
  <item>Test</item>
  <list2>
        <item>Test</item>
        <list3>
            <item>Test</item>
            <item>Test</item>
        </list3>
        <item>Test</item>
        <list3>
            <item>Test</item>
        </list3>
        <item>Test</item>
  </list2>
  <item>Test</item>
</list1>

преобразования:

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

    <xsl:template match="*[starts-with(name(),'list')]">
        <xsl:apply-templates>
            <xsl:with-param name="tab" select="true()"/>
        </xsl:apply-templates>
    </xsl:template>

    <xsl:template match="item">
        <xsl:param name="lvl" select="count(ancestor::*)"/>
        <xsl:param name="tab" select="false()"/>

        <!-- insert entry point tab -->
        <xsl:apply-templates select="text()[$tab and $lvl > 1]" mode="tab">
            <xsl:with-param name="lvl" select="$lvl - 1"/>
        </xsl:apply-templates>

        <!-- recurse levels -->
        <xsl:variable name="name" select="name(ancestor::*[$lvl])"/>
        <xsl:number level="any" from="*[name()=$name]" 
            count="*[name()=$name]/item"/>
        <xsl:text>.</xsl:text>
        <xsl:apply-templates select="self::item[$lvl > 1]">
            <xsl:with-param name="lvl" select="$lvl - 1"/>
        </xsl:apply-templates>

        <!-- print value -->
        <xsl:if test="$lvl = 1">
            <xsl:text> </xsl:text>
            <xsl:value-of select="."/>
            <xsl:text>&#10;</xsl:text>
        </xsl:if>
    </xsl:template>

    <xsl:template match="text()" mode="tab">
        <xsl:param name="lvl"/>
        <xsl:text>&#09;</xsl:text>
        <xsl:apply-templates select="self::text()[$lvl>1]" mode="tab">
            <xsl:with-param name="lvl" select="$lvl - 1"/>
        </xsl:apply-templates>
    </xsl:template>

</xsl:stylesheet>

выход:

1. Test
2. Test
    2.1. Test
        2.1.1. Test
        2.1.2. Test
    2.2. Test
        2.2.1. Test
    2.3. Test
3. Test
1 голос
/ 02 сентября 2011

Для вложенного списка вы, вероятно, должны использовать level="multiple" count="X|Y", но я не могу быть более точным, чем это, не зная (а) как выглядит ваш XML-источник, и (б) каков элемент контекста в точке, гдеВаши именованные шаблоны называются.

...