-2

編集:申し訳ありませんが、質問が少し不明確でした。個々の p ノードを数えながら、p ノードとその子のすべてのテキストを返そうとしています。したがって、<1> は最初の p ノードを指し、<2> は 2 番目のノードを指し、以下同様です。

xml ドキュメントの構造のどこに出現するかに関係なく、個々の要素の出現をカウントしようとしています。for-each ループの有無にかかわらず、position() と count() のバリエーションを試してみましたが、うまくいくものを見つけることができないようです。誰でもこれを行う方法について考えがありますか?

ドキュメントの例は次のとおりです。

<text>
   <body>
     <div1>
       <p>abc</p>
         <div2>
           <p>def</p>
         </div2>
     </div1>
     <div1>
       <p>ghi</p>
         <div2>
           <p>jkl <name>adam</name></p>
           <div3>
              <p>mno</p>
           </div3>
         </div2>
     <p>qrs</p>
     </div1>
 </body>
</text>

戻り値:

<1>abc
<2>def
<3>ghi
<4>jkl adam
<5>mno
<6>qrs
4

2 に答える 2

0

ティムの答えを見る前に、どこのテキストノードに興味があると思いました。

ノードだけを意味するかどうかはまだわからないpので、テキストの祖先を持たないすべてのテキストノードをリストする私のソリューションを次に示します。これにより、同じ結果が得られます。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="1.0">

  <xsl:output method="text"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="/">

    <xsl:for-each select="//*[text()][not(ancestor::text())]">
      <xsl:value-of select="concat('&lt;', position(), '&gt; ', current(), '&#x0A;')"/>
    </xsl:for-each>

  </xsl:template>
</xsl:stylesheet>

出力

<1> abc
<2> def
<3> ghi
<4> jkl adam
<5> adam
<6> mno
<7> qrs
于 2013-04-08T21:36:43.630 に答える
0

xsl:numberあなたの友達はここにいます。これを使用して番号を取得するだけです

<xsl:number select="p" level="any" />

この場合の の使用に注意してくださいlevel

このXSLTを試してください

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="text" />

   <xsl:template match="p">
       <xsl:number select="p" level="any" />
       <xsl:value-of select="concat(') ', ., '&#10;')" />
   </xsl:template>

   <xsl:template match="text()"/>
</xsl:stylesheet>

これにより、次のように出力されます

1) abc
2) def
3) ghi
4) jkl adam
5) mno
6) qrs

テンプレートマッチングtext()を使用して、出力以外の要素のテキストを停止することに注意してくださいp(存在する必要があります)。

于 2013-04-08T21:13:31.397 に答える