Как сослаться на текущее значение в XPath (XSLT)? - PullRequest
1 голос
/ 11 августа 2011

Я пытаюсь запустить это выражение XPath (то есть пытаюсь подсчитать, сколько строк содержимого элемента в моем XML-файле заканчивается буквой-один-f ('a') или буквой-два-f ('A'):

<xsl:value-of  select="count( substring(.,string-length(.) -1,string-length(.) -1)=$letter-one-f or substring(., string-length(.) -1,string-length(.) -1)=$letter-two-f )"/>

но я не знаю, как ссылаться на «текущее значение». Все, что я знаю, это то, что оно обычно представлено точкой «.». Я не знаю, где поставить «сопоставление с шаблоном 'или, если это вообще необходимо.

Этот код, с другой стороны, работает, потому что я указал, что он должен выглядеть в' / n-grams-sorted / n-gram ':

<xsl:value-of select="count(/n-grams-sorted/n-gram[starts-with(.,$letter-one-f) or starts-with(.,$letter-two-f) ])"/>

Я просто не знаю, как применить это к первому выражению. Где я собираюсь получить «текущее значение»? Как я скажу ему, что я хочу посмотреть в '/ n-grams-sorted / n-gram '? Это все, что мне нужно, чтобы мое выражение работало (я пробовал это в «редакторе xpath» моего редактора).

Пример исходного файла XML:

    <n-grams-sorted analysis="N_GRAM_TOKEN3" range="Total Set">
        <n-gram position="1" frequency="3535" probability="0.0447735">. = =</n-gram>
        <n-gram position="2" frequency="322" probability="0.0040784">= = De</n-gram>
        <n-gram position="3" frequency="284" probability="0.0035971">= = Het</n-gram>
        <n-gram position="4" frequency="207" probability="0.0026218">= = Hij</n-gram>
        <n-gram position="5" frequency="168" probability="0.0021278">= = Dit</n-gram>

Спасибо

Ответы [ 2 ]

0 голосов
/ 13 августа 2011

Вот решение:

<xsl:value-of  select="count(/n-grams-sorted/n-gram[substring(.,string-length(.), string-length(.))=$letter-one-f or substring(.,string-length(.), string-length(.))=$letter-two-f ] )"/>

Вся проблема была не в текущем узле ... проблема была в том, что я получал '0' в результате все время, потому что я выполнял строку-длину(.) -1, что неверно, поскольку это означало бы, что «sonya» станет «sony» и начнется с «y».'y' никогда не приведет к 'a', поэтому 0 ... поэтому решение состояло в том, чтобы использовать длину строки (.) .. без -1.

0 голосов
/ 11 августа 2011

По связанным таблицам стилей ясно, что вы не используете шаблонное соответствие вообще. Вы просто сопоставляете корневой узел документа (/) и затем вызываете шаблоны из этого.

Таким образом, ваш текущий узел (.) является корнем документа. Это можно проверить, изменив свой XPath на:

n-grams-sorted/n-gram[starts-with(.,$letter-one-f) or starts-with(.,$letter-two-f) ]

или, равный

./n-grams-sorted/n-gram[starts-with(.,$letter-one-f) or starts-with(.,$letter-two-f) ]

или, равный

current()/n-grams-sorted/n-gram[starts-with(.,$letter-one-f) or starts-with(.,$letter-two-f) ]

В зависимости от того, что вы делаете, если вы работаете только с узлами n-граммы, я думаю, что вы можете заменить исходное правило таблицы стилей на:

    <xsl:template match="n-grams-sorted">
            <xsl:call-template name="draw-grid">
                    <xsl:with-param name="rcount">28</xsl:with-param>
                    <xsl:with-param name="ccount">6</xsl:with-param>
                    <xsl:with-param name="r">0</xsl:with-param>
                    <xsl:with-param name="c">0</xsl:with-param>
            </xsl:call-template>
    </xsl:template>

, а затем упростить XPath до:

  n-gram[starts-with(.,$letter-one-f) or starts-with(.,$letter-two-f)]

текущий узел изменился на самый верхний ( n-грамм-отсортированный ).

...