如何将先前节点元素值与xslt中foreach中的当前节点元素值进行比较

时间:2013-03-24 05:15:37

标签: xslt

我们如何比较上一个Item1值和当前item1值以及xslt.can中每个循环的in,请告诉我。下面是输入。

输入:

<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>

3 个答案:

答案 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>

答案 1 :(得分:1)

您可以使用preceding-sibling axis,例如:

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

答案 2 :(得分:1)

不要试图在“迭代”方面考虑这一点,而是考虑如何首先为for-each选择正确的节点。看起来您只想处理其Item1与输入树中前一个兄弟之前不同的Items元素

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

如果你想在XSLT上取得很大的进步,你需要停止思考循环和赋值等程序性事物,而是学会在功能上思考 - 我想要的输出如何与我开始的输入相关。