Я 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>
как группу, но не возвращается отдельно.
Может кто-нибудь предложить мне способ, чтобы разобраться с этой проблемой ..