1

xslt の for each ループで以前の Item1 の値と現在の item1 の値を比較する方法を教えてください。以下が入力です。

入力:

<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

node-list 内のアイテムが兄弟ではない(そして異なるドキュメントに属している可能性さえある)一般的なケースの一般的な解決策を次に示します。

<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

たとえば、次のようにpreceding-sibling axisを使用できます。

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 に答える