2013-03-24 5 views
1

Как мы можем сравнить значение предыдущего элемента с текущим значением item1 с каждым циклом в xslt.can, пожалуйста, сообщите мне. Ниже приведен вход.Как сравнить значение элемента предыдущего узла с текущим значением элемента узла в foreach в xslt

вход:

<t> 
<Items> 
<Item1>24</Item1> 

</Items> 

<Items> 
<Item1>25</Item1> 

</Items> 

<Items> 
<Item1>25</Item1> 

</Items> 

</t> 

выход:

<t> 

<xsl:for-each select="Items"> 

<xsl:if previos Item1 != current Item1><!-- compare previous item1 with current Item1 --> 





</xsl:for-each> 
</t> 
+0

Вы не предоставили желаемый результат преобразования - пытаетесь ли вы депонировать элементы «Item1»? –

ответ

1

Вы можете использовать preceding-siblingaxis, например так:

not(preceding-sibling::Items[1]/Item1 = Item1) 
+0

За исключением того, что элементы в списке узлов обычно не являются братьями и сестрами. –

1

Не пытайтесь думать об этом термины «итераций», вместо этого подумайте о том, как выбрать правильные узлы для for-each в первую очередь. Похоже, что вы хотите обрабатывать только те элементы, элементы которых Item1 не то же самое, как его непосредственно предшествующего собрата во входном дереве

<xsl:for-each select="Items[preceding-sibling::Items[1]/Item1 != Item1]"> 

Если вы хотите сделать большой прогресс с XSLT вам нужно перестать думать о процедурных вещах, как циклы и назначения и вместо этого научиться мыслить функционально - как результат, который я хочу, связан с входом, с которого я начинаю.

+0

За исключением того, что элементы в списке узлов обычно не являются братьями и сестрами. –

2

Вот общее решение для общего случая, когда элементы в список-узлов не являются братья (и даже может принадлежать к различным документам):

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

<xsl:template match="/*"> 
    <xsl:apply-templates select="Items/Item1"> 
     <xsl:with-param name="pNodeList" select="Items/Item1"/> 
    </xsl:apply-templates> 
</xsl:template> 

<xsl:template match="Item1"> 
    <xsl:param name="pNodeList"/> 

    <xsl:variable name="vPos" select="position()"/> 
    <xsl:copy-of select="self::node()[not(. = $pNodeList[$vPos -1])]"/> 
</xsl:template> 
</xsl:stylesheet> 

Когда это преобразование применяется на прилагаемом документе XML:

<t> 
    <Items> 
     <Item1>24</Item1> 
    </Items> 
    <Items> 
     <Item1>25</Item1> 
    </Items> 
    <Items> 
     <Item1>25</Item1> 
    </Items> 
</t> 

производится разыскиваемый, (предполагается) правильный результат:

<Item1>24</Item1> 
<Item1>25</Item1> 
Смежные вопросы