XSLT: атрибуты XML-элемента, появляющиеся за пределами элемента

#xml #xslt

#xml #xslt

Вопрос:

Итак, я новичок в XSLT и, честно говоря, нахожу их чрезвычайно запутанными. Текущий входной XML-файл имеет следующий стиль:

 <chapter prev_label="5">
    <title>Chapter Title</title>
    <section prev_label="5.1">
        <title>Section 5.1 Title
            <indexterm>
                <primary>index1a</primary>
                <secondary>index1b</secondary>
            </indexterm>
        </title>
        <para>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla vel hendrerit urna. Pellentesque non ante ac felis ullamcorper scelerisque ut vitae tellus. Cras a auctor nulla, a faucibus leo. Fusce iaculis purus         tempor. quis tincidunt mattis. Nunc elit ex, ultrices quis tincidunt vitae, efficitur eu quam. Curabitur mollis egestas
        </para>
        <subsection prev_label="5.1.1">
            <title>Subsection 5.1.1 Title
                <indexterm>
                    <primary>index2a</primary>
                    <secondary>index2b</secondary>
                </indexterm>
            </title>
            <seqlist>
                <item prev_label="1.">ucibus ullamcorper sit amet neclibero.</item>
                <item prev_label="2.">Fusce a tortor bibendum, iaculis mi vitae.</item>
            </seqlist>
        </subsection>
    </section>
</chapter>
  

Мой желаемый результат будет выглядеть следующим образом:

 <section prev_label="5.1">
    <title>Section 5.1 Title
    </title>
    <para>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla vel hendrerit urna. Pellentesque non ante
        ac felis ullamcorper scelerisque ut vitae tellus. Cras a auctor nulla, a faucibus leo. Fusce iaculis purus
        tempor. quis tincidunt mattis. Nunc elit ex, ultrices quis tincidunt vitae, efficitur eu quam. Curabitur mollis egestas
    </para>
    <subsection prev_label="5.1.1">
        <title>Subsection 5.1.1 Title
        </title>
        <seqlist>
            <item prev_label="1.">ucibus ullamcorper sit amet nec libero.</item>
            <item prev_label="2.">Fusce a tortor bibendum, iaculis mi vitae.</item>
        </seqlist>
    </subsection>
</section>
  

Любой раздел / подраздел может иметь теги seqlist, para-теги или оба. Я хочу, чтобы они оставались в моем результирующем выводе, при удалении всех тегов indexterm и их дочерних элементов. Другая проблема, с которой я сталкиваюсь, основана на приложении, которое я запускаю, пользователь выберет либо просто раздел, либо раздел и подраздел. Во всех случаях в выходных данных должны быть показаны все «дочерние» подразделы. Таким образом, если выбран раздел 5.1, должны отображаться раздел 5.1 и все подразделы, начинающиеся с 5.1. если выбран подраздел 5.1.1, будут отображаться все подразделы, начинающиеся с 5.1.1. Наименьший объем подразделов равен 4 цифрам (т.е. 5.1.1.4). Я надеюсь, что это имеет смысл. Поскольку наши вызовы REST форматируются для серверной части, на которой выполняется начальная работа с XML, у нас есть два файла .xsl, один для раздела и один для подраздела. Если пользователь выбирает раздел, применяется раздел XSL, если пользователь выбирает подраздел, применяется подраздел XSL. (т.е. www.restserver.com/book/5/5.1 выделил бы раздел и www.restserver.com/book/5/5.1/5.1.2 выбрал бы подраздел)

раздел XSL:

 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:param name="sectionId"/>
<xsl:template match="chapter">
    <sectionBody>
        <xsl:apply-templates select="section"/>
    </sectionBody>
</xsl:template>
<xsl:template match="section">
    <xsl:apply-templates select="section[@prev_label=$sectionId]"/>
</xsl:template>
<xsl:template match="section[@prev_label=$sectionId]">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>
<xsl:template match="title">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()[not(self::indexterm)]"/>
    </xsl:copy>
</xsl:template>
<xsl:template match="*">
    <xsl:copy-of select="."/>
</xsl:template>
  

подраздел XSL:

 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:param name="subsectionId"/>
<xsl:template match="chapter">
    <subsectionBody>
        <xsl:apply-templates select="section"/>
    </subsectionBody>
</xsl:template>
<xsl:template match="section">
    <xsl:apply-templates select="subsection"/>
</xsl:template>
<xsl:template match="subsection">
    <xsl:apply-templates select="subsection[@prev_label=$subsectionId]"/>
</xsl:template>
<xsl:template match="subsection[starts-with(@prev_label,$subsectionId)]">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>
<xsl:template match="title">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()[not(self::indexterm)]"/>
    </xsl:copy>
</xsl:template>
<xsl:template match="*">
    <xsl:copy-of select="."/>
</xsl:template>
  

Проблема, с которой я сталкиваюсь, заключается в том, что по какой-то причине (которая, я уверен, очевидна для кого-то, кто более разбирается в XSL, чем я) атрибуты prev_label в разделе и подразделе находятся…извлечен? мой вывод в настоящее время выглядит следующим образом:

 <sectionBody>
    <section>5.1
        <title>Section 5.1 Title
        </title>
        <para>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla vel hendrerit urna. Pellentesque non ante
        ac felis ullamcorper scelerisque ut vitae tellus. Cras a auctor nulla, a faucibus leo. Fusce iaculis purus
        tempor. quis tincidunt mattis. Nunc elit ex, ultrices quis tincidunt vitae, efficitur eu quam. Curabitur
        mollis egestas
        </para>
        <subsection>5.1.1
            <title>Subsection 5.1.1 Title
            </title>
            <seqlist>
            <item prev_label="1.">ucibus ullamcorper sit amet nec libero.</item>
            <item prev_label="2.">Fusce a tortor bibendum, iaculis mi vitae.</item>
            </seqlist>
        </subsection>
    </section>
</sectionBody>
  

Все, что я пробовал, либо не имеет атрибута prev_label в нужном месте, либо возвращает ненужные теги. У меня такое чувство, что два файла xsl мешают друг другу, но я не могу точно определить проблему. Я не уверен, что это уместно, но если пользователь выбирает только раздел, теги подразделов будут выведены правильно, однако тег section prev_label будет отображаться за пределами тега, как видно в неправильном выводе.

Комментарии:

1. Я не понимаю взаимосвязи двух таблиц стилей. Применяется ли одно к результату другого?

2. Извините, это не было разъяснено. Я прояснил исходное сообщение, но в основном вызов REST отправляется на один из наших внутренних серверов для извлечения используемого XML. Если пользователь выбирает только раздел (т.е. www.restserver.com/book/5/5.1 ) section.xsl используется, если пользователь выбирает подраздел (т.Е. www.restserver.com/book/5/5.1/5.1.2 ) используется подраздел.xsl.

3. вы используете copy-of в своем последнем шаблоне атрибут, который вы применяете в subsection , который некуда девать. измените последний шаблон на шаблон идентификации и посмотрите.