1

对于 xslt 中的每个循环,我们如何将 Previous Item1 值与当前 item1 值与 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>
4

3 回答 3

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>
于 2013-03-24T15:35:09.167 回答
1

You can use the preceding-sibling axis, for example like this:

not(preceding-sibling::Items[1]/Item1 = Item1)
于 2013-03-24T08:43:28.060 回答
1

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

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

如果您想在 XSLT 方面取得很大进展,您需要停止考虑诸如循环和赋值之类的过程性事情,而是学会从功能上思考——我想要的输出与我开始的输入有什么关系。

于 2013-03-24T09:33:18.810 回答