2016-10-11 8 views
0

私は以下のような文書を持っており、subitem[@role="special"]の数がその親itemから始まる必要があります。xpath 1.0のカウント関数を表現する方法は?

私の問題は、私はsubitemの番号とそのsubitem内の任意のネストされたsubitemsに同じ値を計算する必要があるということです。したがって、subitem[@role="special"]の子孫であるsubitemsのすべてに対して、私は常に同じ値を取得する必要があります。私は、これらは私が試したものの一種である(want N)

<root> 
    <item role="special"> 
     <name>One</name> 
     <subitem> 
      <name>A (want 0)</name> 
     </subitem> 
    </item> 
    <item> 
     <name>Two</name> 
     <subitem role="special"> 
      <name>B (want 1)</name> 
      <subitem> 
       <name>B b (want 1)</name> 
      </subitem> 
     </subitem> 
     <subitem> 
      <name> C (want 0)</name> 
      <subitem>C c (want 0)</subitem> 
     </subitem> 

     <subitem role="special"> 
      <name> D (want 2)</name> 
      <subitem> 
       <name>D d (want 2)</name> 
      </subitem> 
     </subitem> 
    </item> 
</root> 

して、以下のツリーに、私が欲しいものをラベル付けしましたが、私は私がしたいことは可能であるか疑問に思い始めている:

<xsl:template match="subitem"> 
     <xsl:value-of select="count(ancestor-or-self::subitem[@role='special'])"/> 
     <xsl:value-of select="count(preceding-sibling::subitem[@role='special'])"/> 
     <xsl:text> 
     </xsl:text> 
     <xsl:apply-templates/> 
    </xsl:template> 

その返品:

00 
    10 
    10 
    01 
    00 
    11 
    10 

これを行う方法はありますか?

+0

なぜBは1、Dは2ですか?彼らは同じ場合ではありませんか? – Jayvee

+0

Bは 'item 'の下の最初の'サブアイテム[@ role = "special"] 'であり、Dは秒です。私は最終的にこれらの数字を補足ナビゲーションファイルの作成に使用します。 – Tim

答えて

1

私が正しく理解した場合、現在のサブアイテムは特別なものであるか、特別なアイテムの子孫であるか、特別ではないという3つのケースがあります。その後、条件を選択して適用することができます。

<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="subitem"> 
<xsl:choose> 
    <xsl:when test="@role='special'"> 
     <xsl:value-of select="count(preceding-sibling::subitem[@role='special'])+1" /> 
    </xsl:when> 
    <xsl:when test="ancestor::subitem[@role='special']"> 
     <xsl:value-of select="count(preceding::subitem[@role='special'])+1" /> 
    </xsl:when> 
    <xsl:otherwise>0</xsl:otherwise> 
</xsl:choose>  
     <xsl:text> 
     </xsl:text> 
     <xsl:apply-templates/> 
    </xsl:template> 
</xsl:stylesheet> 
+0

あなたは問題を見て、今も私はそれを見ることができます。どうもありがとう。 – Tim

関連する問題