Tricky XSL Problem - Определение позиции в комплексном массиве - PullRequest
2 голосов
/ 30 апреля 2011
        <row>
             <cell>Phrase 1</cell> #0
                <check shuffle="False">
                    <option key="1"/> #1
                    <option key="0"/> #2
                    <option key="0"/> #3
                    <option key="0"/> #4
                    <option key="0"/> #5
                    <option key="0"/> #6
                </check>
                <cell>Phrase 2</cell> #7
                <cell>Phrase 3</cell> #8
                <check shuffle="False">
                    <option key="1"/> #9
                    <option key="0"/> #10
                    <option key="0"/> #11
                    <option key="0"/> #12
                    <option key="0"/> #13
                    <option key="0"/> #14
                </check>
            </row>

У меня есть следующее затруднение.

Мне нужно найти «индекс» в теге «строки» для обеих ячеек и каждого параметра.

Как мне это сделать в XSL?Каждая ячейка считается как один, а также учитываются все дочерние теги «option» в любых братьях и сестрах.Я пометил «индексы», которые я хотел бы получить.Я понимаю, что, вероятно, будет один способ определения индекса "ячейка" по сравнению с элементом "опция".

Я немного знаю о XSL, но этого достаточно, чтобы доставить мне неприятности и разочарование ".Любая помощь приветствуется.

Спасибо как всегда ТАК!

Ответы [ 3 ]

2 голосов
/ 30 апреля 2011

Использование xsl:number:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="node()|@*" name="identity">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="cell|option">
        <xsl:call-template name="identity"/>
        <xsl:variable name="vPosition">
            <xsl:number count="cell|option" level="any" from="row" />
        </xsl:variable>
        <xsl:value-of select="$vPosition - 1"/>
    </xsl:template>
</xsl:stylesheet>

С этим входом (больше row с):

<table>
    <row>
        <cell>Phrase 1</cell> #0                 
        <check shuffle="False">
            <option key="1"/> #1                     
            <option key="0"/> #2                     
            <option key="0"/> #3                     
            <option key="0"/> #4                     
            <option key="0"/> #5                     
            <option key="0"/> #6                 
        </check>
        <cell>Phrase 2</cell> #7                 
        <cell>Phrase 3</cell> #8                 
        <check shuffle="False">
            <option key="1"/> #9                     
            <option key="0"/> #10                     
            <option key="0"/> #11                     
            <option key="0"/> #12                     
            <option key="0"/> #13                     
            <option key="0"/> #14                 
        </check>
    </row>
    <row>
        <cell>Phrase 1</cell> #0
        <check shuffle="False">
            <option key="1"/> #1
            <option key="0"/> #2
            <option key="0"/> #3
        </check>
        <cell>Phrase 2</cell> #4
        <check shuffle="False">
            <option key="1"/> #5
            <option key="0"/> #6
        </check>
        <cell>Phrase 3</cell> #7
    </row>
</table>

Выход:

<table>
    <row>
        <cell>Phrase 1</cell>0 #0                 
        <check shuffle="False">
            <option key="1"></option>1 #1                     
            <option key="0"></option>2 #2                     
            <option key="0"></option>3 #3                     
            <option key="0"></option>4 #4                     
            <option key="0"></option>5 #5                     
            <option key="0"></option>6 #6                 
        </check>
        <cell>Phrase 2</cell>7 #7                 
        <cell>Phrase 3</cell>8 #8                 
        <check shuffle="False">
            <option key="1"></option>9 #9                     
            <option key="0"></option>10 #10                     
            <option key="0"></option>11 #11                     
            <option key="0"></option>12 #12                     
            <option key="0"></option>13 #13                     
            <option key="0"></option>14 #14                 
        </check>
    </row>
    <row>
        <cell>Phrase 1</cell>0 #0
        <check shuffle="False">
            <option key="1"></option>1 #1
            <option key="0"></option>2 #2
            <option key="0"></option>3 #3
        </check>
        <cell>Phrase 2</cell>4 #4
        <check shuffle="False">
            <option key="1"></option>5 #5
            <option key="0"></option>6 #6
        </check>
        <cell>Phrase 3</cell>7 #7
    </row>
</table>
0 голосов
/ 30 апреля 2011

Вот один из способов ее решения:

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

    <xsl:template match="/">
        <indices>
            <xsl:apply-templates select="//cell | //option" mode="index"/>
        </indices>
    </xsl:template>

    <xsl:template match="*" mode="index">
        <index pos="{ position() - 1 }">
            <xsl:value-of select="concat( . , @key )"/>
        </index>
    </xsl:template>
</xsl:stylesheet>

Я выбрал специальный @mode, чтобы выделить происходящее.

Обратите внимание, что position() основан на 1 и действует на«текущий набор узлов», то есть поиск сусла в учебнике по XSLT.

0 голосов
/ 30 апреля 2011

Не уверен, что понимаю вопрос. Это в таблице стилей XSLT при обработке, например, элемент <option>, вы хотите вывести его индекс среди других элементов <option> и <cell>? Для этого вы хотите <xsl:number>.

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