2013-08-16 3 views
0

По отношению к моей функции questionXSLT ПОлОжЕНИЯ() соответствующее фильтрованных узлы

position() возвращает позицию фактического узла в целом документе, как получить позицию по отношению к выбранным узлам. Допустим, у меня есть список из 100 городов, и я исключаю 10 на основе данного списка фильтров (см. Вопрос). Теперь я хочу получить подсчет на основе выбранных узлов, а не исходные позиции документа.

Проще говоря, это вопрос счетчика/приращения, поскольку я вижу, что счетчик невозможен. Как мы можем создать или использовать существующую функцию в качестве position(), чтобы получить позицию узла в выбранных узлах.

Надеюсь, мой вопрос ясен.

редактировать пример сценария

<xsl:template match="/"> 
    <xsl:apply-templates select="db:databaseChangeLog/db:changeSet[*[1][($excludes eq '' or not(@tableName = tokenize($excludes, ',')))]]"/> 
    </xsl:template> 

    <xsl:template match="db:changeSet"> 
     ... 
    </xsl:template> 

Где я выборе родительского узла на основе дочернего узла имя атрибута.

+1

Возможно [этот ответ] (http://stackoverflow.com/questions/226405/find-position-of-a-node-using-xpath) поможет вам? –

ответ

1

Я думаю, что было бы лучше использовать xsl:number. С xsl:number вы должны быть в состоянии исключить элементы намного проще.

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

XML Input

<cities> 
    <city>City One</city> 
    <city>City Two</city> 
    <city>City Three</city> 
    <city>City Four</city> 
    <city>City Five</city> 
    <city>City Six</city> 
    <city>City Seven</city> 
    <city>City Eight</city> 
    <city>City Nine</city> 
    <city>City Ten</city> 
</cities> 

XSLT 2.0 (я думаю, что 2,0 безопасно предположить, так как этот вопрос помечен саксонской и вы использовали разметить в ваш комментарий.)

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

    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:variable name="exclude" select="('City Three','City Six','City Nine')"/> 

    <xsl:template match="city[not(.=$exclude)]"> 
     <city position="{position()}"> 
      <xsl:attribute name="number"> 
       <xsl:number count="city[not(.=$exclude)]"/> 
      </xsl:attribute> 
      <xsl:value-of select="."/> 
     </city> 
    </xsl:template> 

    <xsl:template match="city"/> 

</xsl:stylesheet> 

Выход

<cities> 
    <city position="1" number="1">City One</city> 
    <city position="2" number="2">City Two</city> 
    <city position="4" number="3">City Four</city> 
    <city position="5" number="4">City Five</city> 
    <city position="7" number="5">City Seven</city> 
    <city position="8" number="6">City Eight</city> 
    <city position="10" number="7">City Ten</city> 
</cities> 
+0

спасибо, что у меня была аналогичная проблема – sakhunzai

1

Неправильное описание функции position. См. «http://www.w3.org/TR/xslt20/#focus», в частности «Позиция контекста - это позиция элемента контекста в последовательности обрабатываемых элементов. Он изменяется всякий раз, когда изменяется контекстный элемент. Когда такая инструкция, как xsl: apply-templates или xsl: for-each, используемый для обработки последовательности элементов, первый элемент в последовательности обрабатывается с позицией контекста 1, вторым элементом с позицией контекста 2 и т. д.]. Позиция контекста возвращается позицией выражения XPath() ».

Например, если у нас есть <xsl:apply-templates select="cities/city[not(@abbr = $skip/abbr)]"/>, и мы используем функцию position в шаблоне, соответствующем city элементам, например,

<xsl:template match="city"> 
    <xsl:copy> 
    <xsl:value-of select="position()"/> 
    </xsl:copy> 
</xsl:template> 

мы получим <city>1</city><city>2</city> и так далее.

+0

У меня есть sth complext для вычисления, например ' ' – sakhunzai

+0

спасибо за разъяснение, как я мог использовать эти выше условия в шаблонах-приложениях – sakhunzai

Смежные вопросы