Создание идентификатора HTML путем объединения нескольких предыдущих пронумерованных абзацев - PullRequest
0 голосов
/ 06 января 2012

Я создал рабочий процесс 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 голосов
/ 06 января 2012

Вы можете использовать предшествующую ось для поиска последнего «родительского» раздела, обратите внимание, что вам нужно указать «position() = 1», чтобы убедиться, что вы получите ближайший предшествующий узел.

Не совсем ясно, какой вывод вы ищете, но в этих шаблонах переменная $ anc в каждом случае имеет значение, которое вы ищете, например, '14 -3ciii.

<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>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...