XSL-запрос XSL, определяющий конкретные имена полей

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

У меня есть поля XML:

<field name="audio_format" value="">
 </field>

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

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

<!--MasterClip-->
 <xsl:template match="MasterClip">
 <masterclip>
 <xsl:apply-templates>
 </xsl:apply-templates></masterclip>
</xsl:template>
<xsl:template match="Field">
 <field>
 <xsl:attribute name="name">
 <xsl:value-of select="@name">
 </xsl:value-of></xsl:attribute>
 <xsl:attribute name="value">
 <xsl:value-of select="@value">
 </xsl:value-of></xsl:attribute>
 </field>
</xsl:template>

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

Спасибо

3 ответа

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

<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:apply-templates></xsl:copy>
 </xsl:template>
 <xsl:template match="MasterClip">
 <xsl:copy>
 <xsl:apply-templates select="*[contains($fields, concat('|', @name, '|'))]">
 </xsl:apply-templates></xsl:copy>
 </xsl:template>
</xsl:variable></xsl:output></xsl:stylesheet>

Учитывая этот ввод:

<masterclip>
 <field name="audio_format" value="">
 <field name="camera" value="">
 </field></field></masterclip>

Вывод:

<masterclip>
 <field name="audio_format" value="">
 </field></masterclip>

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

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


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


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

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

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

licensed under cc by-sa 3.0 with attribution.