2015-09-11 2 views
0

Я XML, как следует,XSLT - Использование для-каждой группе для следующих братьев

<doc> 
    <h1>header 1</h1> 
    <p>para</p> 
    <p>para</p> 

    <h1>header 2</h1> 
    <p>para</p> 
    <h2>header 2 sub h1</h2> 
    <h2>header 2 sub h2</h2> 

    <h1>header 3</h1> 
    <p>para</p> 
    <p>para</p> 

    <h1>header 4</h1> 
    <h2>header 4 sub h1</h2> 
    <p>para</p> 

</doc> 

, что мне нужно, это получить все <h1> и <h2> узлов соответственно, и создать неупорядоченный список со ссылками,

поэтому требуемый выход,

<doc> 
    <ul> 
     <li><h1><a href="page-header1-1">header 1</a></h1></li> 

     <li><h1><a href="page-header1-2">header 2</a></h1></li> 
     <ul> 
      <li><h2><a href="page-header2-1">header 2 sub h1</a></h2></li> 
      <li><h2><a href="page-header2-2">header 2 sub h2</a></h2></li> 
     </ul> 

     <li><h1><a href="page-header1-3">header 3</a></h1></li> 

     <li><h1><a href="page-header1-4">header 4 sub h1</a></h1></li> 
     <ul> 
      <li><h2><a href="page-header2-3">zz</a></h2></li> 
     </ul> 
    </ul> 
</doc> 

Я написал следующий XSL для достижения этой задачи,

<xsl:template match="doc"> 
     <div> 
      <ul> 
       <xsl:for-each-group select="*" group-starting-with="h1"> 
        <li><a href="page-header1-{count(preceding::h1)+1}"> <xsl:copy-of select="."/></a> </li> 
        <ul> 
         <li><a href="page-header2-{count(preceding::h2)+1}"><xsl:apply-templates select="current-group()[self::h2]"/></a></li> 
        </ul> 
       </xsl:for-each-group> 
      </ul> 
     </div> 
    </xsl:template> 

мой выход выглядит так,

<doc> 
    <ul> 
     <li><a href="page-header1-1"><h1>header 1</h1></a></li> 
      <ul><li><a href="page-header2-1"/></li></ul> 

     <li><a href="page-header1-2"><h1>header 2</h1></a></li> 
      <ul> 
       <li> 
        <a href="page-header2-1"> 
         <h2>header 2 sub h1</h2> 
         <h2>header 2 sub h2</h2> 
        </a> 
       </li> 
      </ul> 

     <li><a href="page-header1-3"><h1>header 3</h1></a></li> 
      <ul><li><a href="page-header2-3"/></li></ul> 

     <li><a href="page-header1-4"><h1>header 4</h1></a></li> 
      <ul> 
       <li> 
        <a href="page-header2-3"> 
         <h2>header 4 sub h1</h2> 
        </a> 
       </li> 
      </ul> 
    </ul> 
</doc> 

Я определил 2 ошибки там

1) добавляет пустые <a href="page-header2-x"></a> значения, где нет ни одного следующих братьев и сестер для <h1> с. (см. результаты 1 и 3 <h1> с)

2) <a> не добавляются отдельно к <h2> узлам. но он добавляет <a> группе <h2> s, которые последовательно помещаются. (см. ниже 2 <h1> в результате) Но мне нужно добавить <a> отдельно для каждого <h2>.

Я использовал <xsl:apply-templates select="current-group()[self::h2]"/>, чтобы получить <h2> s и кажется, что он возвращает все <h2> как группу, но не возвращается отдельно.

Может кто-нибудь предложить мне способ, чтобы разобраться с этой проблемой ..

ответ

1

Изменение <ul> <li><a href="page-header2-{count(preceding::h2)+1}"><xsl:apply-templates select="current-group()[self::h2]"/></a></li> </ul> в

<xsl:variable name="h2" select="current-group()[self::h2]"/> <xsl:if test="$h2"> <ul> <xsl:apply-templates select="$h2"/> </ul> </xsl:if>

и добавить шаблон <xsl:template match="h2"> <li><a href="page-header2-{position()"><xsl:copy-of select="."/></a></li> </xsl:template>

Смежные вопросы