#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
, который некуда девать. измените последний шаблон на шаблон идентификации и посмотрите.