Jennie, [We have not begun using the Schema yet. So my comments are from the DTD standpoint.] Their is significant complexity in creating TOC for EAD documents. As Joseph as stated, the dsc/@type attribute is little help. The @type value is not checked against the dsc. Thus a valid dsc could have a mis-named @type value. The key is to test for the @level attribute value(s). Whatever key terms your @level attributes use, the next problem is that series and subseries are not strictly hierarchical with the component structure of the EAD dsc. Finally, @type='subseries' may or may not be noteworthy for a TOC. The @type='subseries' can be used for many and in many ways simply designating a significant break in the hierarchical processing of the material. (One reason why I insist on having a (@type='subseries' && child::scopecontent) in order to qualify for a TOC entry.) The necessity arises to iterate through the entire DSC in order to build the TOC. I have done this with 2 generic templates (EAD_2002_HTML_conv-1.xsl). Coding practices are really necessary for consistency sake. [Code below] Mike Ferrando Library Technician Library of Congress Washington, DC (202) 707-4454 BTW: You will want to suppress the @IDs in the TOC HTML to stop dup anchor/@name from occurring. =========================== <!-- File: EAD_2002_HTML_conv-1.xsl --> <!-- Date: 3 September 2004 --> <!-- Updated: 03 january 2007 --> <!-- Creator: Michael A. Ferrando --> <!-- Editor used: NoteTab Pro 4.5 --> <!-- EAD 2002 tag set --> <!-- Library of Congress best practices respected --> <!-- Templates closed: notestmt --> <!-- Attributes not respected: @audience --> <!-- extptr Library of Congress seal respected --> <!-- Otherwise: extptr become @external-destination links --> <xsl:template match="c01" mode="desc_series_toc_x"> <xsl:param name="desc_series_query"/> <xsl:param name="get_names"/> <xsl:param name="desc_series_toc_nix_container_x"/> <xsl:variable name="c_n_nm" select="number(substring(name(), 2, string-length(name()))) + 1"/> <xsl:variable name="fixed_c_sl"> <xsl:if test="string-length($c_n_nm)=1"> <xsl:value-of select="concat('c0', $c_n_nm)"/> </xsl:if> <xsl:if test="string-length($c_n_nm)=2"> <xsl:value-of select="concat('c', $c_n_nm)"/> </xsl:if> </xsl:variable> <xsl:variable name="c01_ct"> <xsl:number count="c01"/> </xsl:variable> <xsl:variable name="d_s_q"> <xsl:number count="c01"/> </xsl:variable> <!-- C01 Rows --> <!-- spacer row before series --> <!-- spacer row before series --> <TR> <TD VALIGN="top" COLSPAN="14"></TD> </TR> <!-- row for unittitle --> <xsl:apply-templates select="did/unittitle" mode="dsc_did_children"> <xsl:with-param name="lv" select="number(substring(name(), 2, string-length(name())))"/> <xsl:with-param name="c01_ct" select="$c01_ct"/> <xsl:with-param name="desc_series_query" select="$d_s_q"/> <xsl:with-param name="agg_ct" select="number(1000 + $c01_ct)"/> <xsl:with-param name="desc_series_toc_nix_container_x" select="$desc_series_toc_nix_container_x" /> </xsl:apply-templates> <xsl:choose> <xsl:when test="*[name()=$fixed_c_sl and @level='subseries']"> <xsl:apply-templates select="*[name()=$fixed_c_sl and @level='subseries']" mode="desc_series_toc_xx"> <xsl:with-param name="agg_ct" select="number(1000 + $c01_ct)"/> <xsl:with-param name="desc_series_toc_nix_container_x" select="$desc_series_toc_nix_container_x" /> </xsl:apply-templates> </xsl:when> <xsl:otherwise> </xsl:otherwise> </xsl:choose> </xsl:template> <!-- table of contents for container heading --> <xsl:template match=" c02 | c03 | c04 | c05 | c06 | c07 | c08 | c09 | c10 | c11 | c12" mode="desc_series_toc_xx" > <xsl:param name="desc_series_query"/> <xsl:param name="get_names"/> <xsl:param name="agg_ct"/> <xsl:param name="desc_series_toc_nix_container_x"/> <xsl:variable name="t" select="count(parent::*/*)"/> <xsl:variable name="f" select="count(following-sibling::*)"/> <xsl:variable name="p" select="$t - $f"/> <xsl:variable name="c_n_nm" select="number(substring(name(), 2, string-length(name()))) + 1"/> <xsl:variable name="fixed_c_sl"> <xsl:if test="string-length($c_n_nm)=1"> <xsl:value-of select="concat('c0', $c_n_nm)"/> </xsl:if> <xsl:if test="string-length($c_n_nm)=2"> <xsl:value-of select="concat('c', $c_n_nm)"/> </xsl:if> </xsl:variable> <!-- spacer row before subseries --> <TR> <TD VALIGN="top" COLSPAN="14"></TD> </TR> <!-- row for unittitle --> <xsl:apply-templates select="did/unittitle" mode="dsc_did_children"> <xsl:with-param name="lv" select="number(substring(name(), 2, string-length(name())))"/> <xsl:with-param name="c02_ct" select="number($p)"/> <xsl:with-param name="desc_series_query" select="number($p)"/> <xsl:with-param name="agg_ct" select="concat($agg_ct, number(1000 + $p))"/> <xsl:with-param name="desc_series_toc_nix_container_x" select="$desc_series_toc_nix_container_x" /> </xsl:apply-templates> <!-- subseries --> <xsl:choose> <xsl:when test="*[name()=$fixed_c_sl and @level='subseries']"> <xsl:apply-templates select="*[name()=$fixed_c_sl and @level='subseries']" mode="desc_series_toc_xx"> <xsl:with-param name="agg_ct" select="concat($agg_ct, number(1000 + $p))"/> <xsl:with-param name="desc_series_toc_nix_container_x" select="$desc_series_toc_nix_container_x" /> </xsl:apply-templates> </xsl:when> <xsl:otherwise> </xsl:otherwise> </xsl:choose> </xsl:template> ____________________________________________________________________________________ Be a better sports nut! Let your teams follow you with Yahoo Mobile. Try it now. http://mobile.yahoo.com/sports;_ylt=At9_qDKvtAbMuh1G1SQtBI7ntAcJ