我们如何比较上一个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>
答案 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上取得很大的进步,你需要停止思考循环和赋值等程序性事物,而是学会在功能上思考 - 我想要的输出如何与我开始的输入相关。