2

ノードのセットがあります

<menuList>
  <mode name="aasdf"/>
  <mode name="vfssdd"/>
  <mode name="aswer"/>
  <mode name="ddffe"/>
  <mode name="ffrthjhj"/>
  <mode name="dfdf"/>
  <mode name="vbdg"/>
  <mode name="wewer"/>
  <mode name="mkiiu"/>
  <mode name="yhtyh"/>
  and so on...
</menuList>

今はこのように整理しています

 <xsl:variable name="rtf">
    <xsl:for-each select="//menuList/mode">
       <xsl:sort data-type="text" order="ascending" select="@name"/>
          <xsl:value-of select="@name"/>
    </xsl:for-each>
 </xsl:variable>

ここで、ソートされた配列内の任意の要素をその位置の番号に取得する必要があります。私はコードを使用しています:

<xsl:value-of select="exsl:node-set($rtf)[position() = 3]"/>

応答エラーが発生します。どうすればいいですか?

4

2 に答える 2

4

提供されたコードには少なくとも2つのエラーがあります。

  1. <xsl:value-of select="@name"/>

隣接するテキストノードが複数存在する場合、それらは1つに結合されます。その結果、RTFには1つの(長い)単一のテキストノードがあり、3番目のノードはありません。

2<xsl:value-of select="exsl:node-set($rtf)[position() = 3]"/>

exsl:node-set($rtf)これは、に含まれる3番目のノードを要求しますが、拡張関数exsl:node-set($rtf)によって生成された一時ツリーのドキュメントノードです。これは1つのノードのみです。exsl:node-set()したがって、上記のXPath式は何も選択しません。

正しい解決策の1つは次のとおりです。

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:msxsl="urn:schemas-microsoft-com:xslt"
 >

 <xsl:template match="/">
    <xsl:variable name="rtf">
        <xsl:for-each select="//menuList/mode">
           <xsl:sort data-type="text" order="ascending" select="@name"/>
              <xsl:copy-of select="."/>
        </xsl:for-each>
     </xsl:variable>
    <xsl:value-of select="msxsl:node-set($rtf)/*[position()=3]/@name"/>
 </xsl:template>
</xsl:stylesheet>
于 2010-03-18T16:47:55.873 に答える
2

<xsl:value-of>変数で使用します。これはノードをコピーしませんが、その文字列値(ノードの@name属性値)をコピーします。これは、連結された文字列を含む変数を生成することを意味しますが、構造体は含まれません。

試す:

<xsl:variable name="rtf">
  <xsl:for-each select="//menuList/mode">
    <xsl:sort select="@name" data-type="text" order="ascending" />
    <xsl:copy-of select="."/>
  </xsl:for-each>
</xsl:variable>

<mode>これで、変数に、優先順位のノードで構成される結果ツリーフラグメントが含まれます。これは、次のことを意味します。

<xsl:value-of select="exsl:node-set($rtf)/*[3]/@name" />
<!-- don't forget you have element nodes now! ^^^^^^ -->

動作します。…/*[position() = 3]また、と…/*[3]は同じことであることに注意してください。

于 2010-03-18T16:44:34.467 に答える