2017-03-15 5 views
1

次の例では、XPath(2.0)式を持つノードの「入れ子レベル」を決定したいと考えています。この「ネスティングレベル」は、連続する子孫の数である。 「スパン/スパン/スパンが」存在している場合、それは3期待入れ子のレベルは、コメントに記載されていることになります。今XPathの入れ子レベルを調べる方法は?

<?xml version="1.0" encoding="UTF-8"?> 
<text> 
    <div>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget 
     dolor. Aenean massa. 
     <span><!--nesting level:2-->Cum sociis natoque penatibus et magnis dis parturient montes, 
      nascetur ridiculus mus. 
      <span><!--nesting levels:1-->Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. 
       <span><!--nesting levels:0-->Nulla consequat massa quis enim.</span> 
      </span> 
      <span><!--nesting levels:0-->Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu.</span> 
      In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. 
     </span> 
     <span><!--nesting levels:0-->Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus 
      elementum semper nisi. 
     </span> 
     <span><!--nesting levels:0-->Aenean vulputate eleifend tellus. Aenean leo ligula, 
      porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra 
      quis, feugiat a, tellus. 
     </span> 
    </div> 
    <div>Phasellus viverra nulla ut metus varius laoreet. 
     <span><!--nesting levels:0-->Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel augue. 
     </span> 
     <span><!--nesting levels:2-->Curabitur ullamcorper ultricies nisi. 
      <span><!--nesting levels:0-->Nam eget dui.</span> 
      Etiam rhoncus. 
      <span><!--nesting levels:1-->Maecenas tempus, tellus eget condimentum rhoncus, sem quam semper libero, sit amet 
       adipiscing sem neque sed ipsum. 
       <span><!--nesting levels:0-->Nam quam nunc, blandit vel, luctus pulvinar, hendrerit id, lorem.</span> 
       <span><!--nesting levels:0-->Maecenas nec odio et ante tincidunt tempus.</span> 
       Donec vitae sapien ut libero venenatis faucibus. 
       <span><!--nesting levels:0-->Nullam quis ante.</span> 
      </span> 
      Etiam sit amet orci eget eros faucibus tincidunt. Duis leo. Sed fringilla mauris sit amet 
      nibh. 
     </span> 
     Donec sodales sagittis magna. 
    </div> 
</text> 

、私はcount(descendant::span))を試してみましたが、明らかに、これはまた、任意の兄弟が含まれており、間違ったが生成されます多くの場合に結果となる。私もcount(descendant::span[1]))count(descendant::span[position() = 1]))を試しましたが、これも誤った結果をもたらしました。私はまだ合計から兄弟の数を除外する方法を見つけ出すことができませんでした。どんなヒントもありがとうございます。 XSLT内

答えて

2

私はスタイルシート

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    exclude-result-prefixes="xs" 
    version="2.0"> 

    <xsl:template match="@* | node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="span"> 
     <xsl:copy> 
      <xsl:attribute name="nesting-level" 
       select=" 
       max(
        for $leaf in descendant-or-self::span[not(span)] 
        return count($leaf/ancestor-or-self::span except ancestor-or-self::span) 
       )"/> 
      <xsl:apply-templates select="@* | node()"/> 
     </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

に例えば表現

  max(
       for $leaf in descendant-or-self::span[not(span)] 
       return count($leaf/ancestor-or-self::span except ancestor-or-self::span) 
      ) 

と右の値を取得、私は出力

<?xml version="1.0" encoding="UTF-8"?><text> 
    <div>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget 
     dolor. Aenean massa. 
     <span nesting-level="2"><!--nesting level:2-->Cum sociis natoque penatibus et magnis dis parturient montes, 
      nascetur ridiculus mus. 
      <span nesting-level="1"><!--nesting levels:1-->Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. 
       <span nesting-level="0"><!--nesting levels:0-->Nulla consequat massa quis enim.</span> 
      </span> 
      <span nesting-level="0"><!--nesting levels:0-->Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu.</span> 
      In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. 
     </span> 
     <span nesting-level="0"><!--nesting levels:0-->Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus 
      elementum semper nisi. 
     </span> 
     <span nesting-level="0"><!--nesting levels:0-->Aenean vulputate eleifend tellus. Aenean leo ligula, 
      porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra 
      quis, feugiat a, tellus. 
     </span> 
    </div> 
    <div>Phasellus viverra nulla ut metus varius laoreet. 
     <span nesting-level="0"><!--nesting levels:0-->Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel augue. 
     </span> 
     <span nesting-level="2"><!--nesting levels:2-->Curabitur ullamcorper ultricies nisi. 
      <span nesting-level="0"><!--nesting levels:0-->Nam eget dui.</span> 
      Etiam rhoncus. 
      <span nesting-level="1"><!--nesting levels:1-->Maecenas tempus, tellus eget condimentum rhoncus, sem quam semper libero, sit amet 
       adipiscing sem neque sed ipsum. 
       <span nesting-level="0"><!--nesting levels:0-->Nam quam nunc, blandit vel, luctus pulvinar, hendrerit id, lorem.</span> 
       <span nesting-level="0"><!--nesting levels:0-->Maecenas nec odio et ante tincidunt tempus.</span> 
       Donec vitae sapien ut libero venenatis faucibus. 
       <span nesting-level="0"><!--nesting levels:0-->Nullam quis ante.</span> 
      </span> 
      Etiam sit amet orci eget eros faucibus tincidunt. Duis leo. Sed fringilla mauris sit amet 
      nibh. 
     </span> 
     Donec sodales sagittis magna. 
    </div> 
</text> 
+0

に感謝を取得!これは印象的です。私はこのソリューションがこの複雑なものであるとは思わなかった。私は後でそれをチェックしなければならないでしょう - 遅れて申し訳ありません! –

+2

これは、与えられた例に対して正しい答えを与えるかもしれませんが、パスのspan要素が連続していなければならないという要件を満たそうとしません: 'span/div/div/span/span> –

+2

私はあなたが '[origin :: ancestor :: * except $ a/self :: span]を除いて' [ancestor :: *のすべての$ a]という述語で 'descendant :: span'を修飾しなければならないと修正するために、 '$ originは最も外側のコンテキストノードにバインドされています。 –

関連する問題