通过连接多个先前编号的段落来构建HTML ID

时间:2012-01-06 05:09:48

标签: html xml xslt

我创建了一个XML工作流,允许用户使用丰富的超文本方案创建HTML输出,该方案使用XSL构建锚点和超链接。但是我在使用父元素中的编号为文本的特定子部分的第二级和第三级创建锚点时遇到了问题。

主要部分有一个数字,如14,子部分使用数字和数字用短划线,如14-1,14-2。下一级使用诸如a,b,c之类的字母。下一级使用罗马数字,例如i,ii,iii等。

因此锚点应该引用前面的每个父节点,例如14-2ci或14-3cii。

以下是XML的示例(抱歉格式化,我无法通过缩进四个空格来正确显示代码):

<Root><RULE>


<rule_subhead><num_sub>14-3</num_sub>. Artificial Devices, Unusual Equipment and Unusual Use of Equipment
</rule_subhead>

<rule_letter><strong><num>a</num>.</strong> That might assist him in making a <em>stroke</em> or in his play; or
</rule_letter>

<rule_letter><strong><num>b</num>.</strong> For the purpose of gauging or measuring distance or conditions that might affect his play; or
</rule_letter>

<rule_letter><strong><num>c</num>.</strong> That might assist him in making a <em>stroke</em> or in his play; or
</rule_letter>

<rule_letter_sub>(<num>i</num>) gloves may be worn provided that they are plain gloves;
</rule_letter_sub>

<rule_letter_sub>(<num>ii</num>) resin, powder and drying or moisturizing agents may be used; and
</rule_letter_sub>

<rule_letter_sub>(<num>iii</num>) a towel or handkerchief may be wrapped around the grip.
</rule_letter_sub> </RULE> </Root>

这些数字都标有<num>标记。有没有办法连接前面元素中的所有数字,如果它们不是嵌套父类?

由于

1 个答案:

答案 0 :(得分:0)

您可以使用前面的轴查找最后一个父母&#39;部分,请注意您需要指定&#39; position() = 1&#39;确保您获得最近的前置节点。

我们不清楚您之后输出的是什么,但在这些模板中,每种情况下的$ anc变量都具有您之后的值。 &#39; 14-3ciii&#39;

<xsl:template match="*">
    <xsl:copy>
        <xsl:copy-of select="@*"/>
        <xsl:apply-templates/>
    </xsl:copy>
</xsl:template>

<xsl:template match="rule_subhead/num_sub">
    <xsl:variable name="anc"><xsl:value-of select="." /></xsl:variable>
    <a name="{$anc}"><xsl:value-of select="." /></a>
</xsl:template>

<xsl:template match="rule_letter//num">
    <xsl:variable name="anc">
        <xsl:value-of select="preceding::rule_subhead[position() = 1]/num_sub" />
        <xsl:value-of select="." />
    </xsl:variable>
    <a name="{$anc}"><xsl:value-of select="." /></a>
</xsl:template>

<xsl:template match="rule_letter_sub/num">
    <xsl:variable name="anc">
        <xsl:value-of select="preceding::rule_subhead[position() = 1]/num_sub" />
        <xsl:value-of select="preceding::rule_letter[position() = 1]//num" />
        <xsl:value-of select="." />
    </xsl:variable>
    <a name="{$anc}"><xsl:value-of select="." /></a>
</xsl:template>