2012-06-29 1 views
1

Существует списокиспользование XSL: номер incide если

<nodes> 
<node attr='1'/> 
<node attr='0'/> 
<node attr='1'/> 
<node attr='1'/> 
</nodes> 

мне нужно применить-шаблоны всех узлов и считать его:

<xsl:apply-templates select='nodes/node'> 
<xsl:if test='@attr=1'> 
<xsl:number/> 
</xsl:if> 
</xsl:apply-templates> 

но ХАЗ в результате не 123, результат 134. Как исправить это в xslt-1.0? Есть еще один способ установить номера? положение() не помогает, и

<xsl:apply-templates select='nodes/node[@attr=1]'> 
<xsl:if test='@attr=1'> 
<xsl:number/> 
</xsl:if> 
</xsl:apply-templates> 

не помогает = (((

+0

Какой номер вы хотите распечатать? В XML нет номера, связанного с 123 или 134 –

+0

Не знаете, зачем вам нужно 123, или что это будет означать? – Woody

+0

Вы хотите иметь инкрементирующий индекс по элементам, найденным XPath 'nodes/node [@ attr = 1]', правильно? –

ответ

2

Во-первых, у Вас есть ошибка в вашем XSLT

<xsl:apply-templates select='nodes/node'> 
    <xsl:if test='@attr=1'> <xsl:number/>  
    </xsl:if> 
</xsl:apply-templates> 

Вы не можете иметь XSL: если внутри XSL: применять-шаблоны. Вам нужен соответствующий XSL: шаблон и поместить код там ...

<xsl:apply-templates select="nodes/node" /> 

<xsl:template match="node"> 
    <xsl:if test='@attr=1'> 
     <xsl:number/>  
    </xsl:if> 
<xsl:template> 

На самом деле, вы могли бы покончить с XSL: если здесь, и просто испытание в матче шаблона

<xsl:template match="node[@attr=1]"> 
    <xsl:number/>  
<xsl:template> 

Но чтобы ответить на ваш вопрос, вы, вероятно, нужно использовать счета атрибут на XSL: число элемент сосчитать только те элементы, которые вы хотите

<xsl:number count="node[@attr=1]"/> 

Вот полный XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="/"> 
     <xsl:apply-templates select="nodes/node"/> 
    </xsl:template> 

    <xsl:template match="node[@attr=1]"> 
     <xsl:number count="node[@attr=1]"/> 
    </xsl:template> 

    <xsl:template match="node"/> 
</xsl:stylesheet> 

Применительно к вам XML, результат 123

2

Это говорит 123 - это то, что вы были после

<xsl:for-each select="nodes/node[@attr='1']"> 
    <xsl:value-of select="position()"/> 
</xsl:for-each> 
+0

Можно ли добиться того же результата с ? – unclenorton

0

Это не совсем понятно, что это? вы пытаетесь достичь. Я полагаю, вам нужно подсчитать количество узлов, для которых установлен атрибут 1. В этом случае используйте функцию count:

<xsl:value-of select="count(nodes/node[@attr='1'])" /> 

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

<xsl:for-each select="nodes/node[@attr='1']"> 
    <xsl:value-of select="position()" /> 
</xsl:for-each> 
+0

Но это даст вам 3, в то время как я думаю, что они, похоже, хотят 123. Нет, я даже не знаю, почему и так? – Woody

+0

@Woody: 123 будет напоминать нумерацию совпадающих узлов. то есть первый согласованный узел имеет номер 1, второй согласованный узел имеет номер 2 и т. д. то естьто же самое, что вы можете указать в квадратных скобках, чтобы указать, какой из найденных узлов вы хотите вернуть. –

+0

Согласен, есть причины, по которым вы, возможно, захотите присвоить число узлов, это просто недостаточно хорошо описано в вопросе, какова фактическая причина. – Woody