XSL Вопрос XSL выбора конкретных имен полей - PullRequest
4 голосов
/ 29 июня 2011

Интересно, сможет ли кто-нибудь мне помочь или направить меня в правильном направлении.В настоящее время у меня возникают проблемы с возвратом нужных элементов из файла XML.Я просто пытаюсь получить урезанную версию большого XML-файла, который у меня есть, поэтому он выводит другой XML-файл (а не HTML, на котором много учебников).

У меня есть поля XML, такие как:

      <Field name="audio_format" value="" />
      <Field name="camera" value="" />

Однако у меня есть много других элементов для перечисления здесь, у меня есть один для всех мыслимых метаданных, которые вы хотели бы включить в видео илиаудиофайл.

Так что мой вопрос и проблема в том, как мне указать в моем XSL имена полей, которые нужно захватить, он в настоящее время захватывает все внутри тегов, что хорошо, но это не правильно.мой XSL.

         <!--MasterClip-->
 <xsl:template match="MasterClip">
    <MasterClip>
        <xsl:apply-templates />
    </MasterClip>
</xsl:template>

<xsl:template match="Field">
    <Field>
        <xsl:attribute name="name">
            <xsl:value-of select="@name" />
        </xsl:attribute>
        <xsl:attribute name="value">
            <xsl:value-of select="@value" />
        </xsl:attribute>
    </Field>

У меня около 50 полей для вывода, однако я хочу выбрать только те, которые я укажу (10 из них).Я попробовал несколько примеров, но большинство из них касаются поиска и сортировки, любая помощь будет отличной.Даже простой пример, показывающий, как выбрать один из них, и я могу просто воспроизвести его для остальных !.

Спасибо

Ответы [ 3 ]

1 голос
/ 29 июня 2011

Вы можете использовать сопоставление с шаблоном напрямую:

<xsl:template match="Field[matches(@name,'audio_format|camera')]">
  <xsl:copy-of select="."/>
 </xsl:template>

Где matches - это просто функция XSLT 2.0.

1 голос
/ 29 июня 2011

Вы можете указать предикаты для применения шаблонов:

<xsl:apply-templates select="/Field[@name='audio_format' or @name='camera']" />
0 голосов
/ 29 июня 2011

Это можно сделать довольно обобщенно, используя переменную, которая перечисляет имена полей, которые будут скопированы:

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" encoding="utf-8" indent="no" />
    <xsl:variable name="fields" select="'|audio_format|camera|'" />
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()" />
        </xsl:copy>
    </xsl:template>
    <xsl:template match="MasterClip">
        <xsl:copy>
            <xsl:apply-templates select=
                "*[contains($fields, concat('|', @name, '|'))]" />
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

С учетом этого ввода:

<MasterClip>
    <Field name="audio_format" value="" />
    <Field name="camera" value="" />
    <Field name="some_other_name" value="" />
</MasterClip>

Вывод:

<MasterClip>
    <Field name="audio_format" value="" />
    <Field name="camera" value="" />
</MasterClip>

Примечание: В этом примере используется преобразование идентичности для копирования элементов Field.Если вам не нужна прямая копия, просто создайте отдельный шаблон для обработки этих элементов.

Примечание также: Это XSLT 1.0-совместимый.

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