Изменить элемент узла, если элемент больше или меньше целого числа? - PullRequest
0 голосов
/ 25 мая 2019

Мне нужно вывести / изменить элемент (ы) в XML, где элемент

  1. <TrackNumber> соответствует целому числу от 2 (до бесконечности)
  2. чтение из XML больше, меньше, меньше, равно или равно заданному целочисленному значению

Критерии: для элементов, соответствующих TrackNumber 2 и далее (до бесконечности):

FOR <ScannedTrack>
WHERE <TrackNumber>2 (and onwards)
IF <Codec>2048</Codec>
AND <Bitrate> is <= LESS THAN OR EQUAL TO <Bitrate>192000</Bitrate>

OUTPUT/WRITE <Encoder> item as:
<Encoder>Ac3Passthrough</Encoder>
AND DELETE element/node <MixDown>


FOR <ScannedTrack>
<TrackNumber>2 (and onwards)
IF <Codec>2048</Codec> or <Codec>16777216</Codec> or <Codec>262144</Codec> or <Codec>8192</Codec> or <Codec>4444</Codec>
AND <Bitrate> is > GREATER THAN <Bitrate>192000</Bitrate>

OUTPUT/WRITE the following to each specific item:
<AudioTrack>
<MixDown>stereo</MixDown>
<Encoder>Ac3</Encoder>
<Bitrate>192</Bitrate>

ПРИМЕЧАНИЕ: Элементы <MixDown>, <Encoder> and <Bitrate> уже содержат существующие значения, поэтому заменяйте / перезаписывайте их значениями вывода / записи, показанными выше, если они соответствуют условиям.

Может кто-нибудь помочь мне с сценариями - VBScript, XSLT или Batch with Regex, чтобы помочь достичь требуемого результата?

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

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

        <xsl:mode on-no-match="shallow-copy"/>

        <xsl:template match="AudioTrack[ScannedTrack/TrackNumber = (>= '2')]">
            <xsl:template match="AudioTrack[ScannedTrack[Codec = (2048)] and [Bitrate (<=192000)]/Encoder">
                <xsl:copy>Ac3Passthrough</xsl:copy>
            </xsl:template>


            <xsl:template match="AudioTrack[ScannedTrack/TrackNumber = (>= '2')]">
                <xsl:template match="AudioTrack[ScannedTrack[Codec = (2048, 262144, 8192, 4444, 16777216)] and [Bitrate = (>192000)]/MixDown/Encoder/Bitrate">
                    <xsl:copy>Stereo</xsl:copy>
                    <xsl:copy>Ac3</xsl:copy>
                    <xsl:copy>192</xsl:copy>
                </xsl:template>

            </xsl:stylesheet>

Вот пример XML-файла для тестирования:

<?xml version="1.0"?>
<ArrayOfQueueTask xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <QueueTask>
        <Task>
            <AudioTracks>
                <AudioTrack>
                    <MixDown>5point1</MixDown>
                    <Encoder>EAc3</Encoder>
                    <EncoderRateType>Bitrate</EncoderRateType>
                    <Bitrate>448</Bitrate>
                    <ScannedTrack>
                        <TrackNumber>1</TrackNumber>
                        <Description>English (E-AC3) (5.1 ch)</Description>
                        <Codec>16777216</Codec>
                        <Bitrate>448000</Bitrate>
                    </ScannedTrack>
                </AudioTrack>
                <AudioTrack>
                    <MixDown>5point1</MixDown>
                    <Encoder>Ac3</Encoder>
                    <EncoderRateType>Bitrate</EncoderRateType>
                    <Bitrate>192</Bitrate>
                    <ScannedTrack>
                        <TrackNumber>2</TrackNumber>
                        <Description>English (AC3) (5.1 ch)</Description>
                        <Codec>2048</Codec>
                        <Bitrate>192000</Bitrate>
                    </ScannedTrack>
                </AudioTrack>
                <AudioTrack>
                    <MixDown>stereo</MixDown>
                    <Encoder>EAc3</Encoder>
                    <EncoderRateType>Bitrate</EncoderRateType>
                    <Bitrate>224</Bitrate>
                    <ScannedTrack>
                        <TrackNumber>3</TrackNumber>
                        <Description>English (E-AC3) (5.1 ch)</Description>
                        <Codec>16777216</Codec>
                        <Bitrate>224000</Bitrate>
                    </ScannedTrack>
                </AudioTrack>
                <AudioTrack>
                    <MixDown>5point1</MixDown>
                    <Encoder>Ac3</Encoder>
                    <EncoderRateType>Bitrate</EncoderRateType>
                    <Bitrate>128</Bitrate>
                    <ScannedTrack>
                        <TrackNumber>4</TrackNumber>
                        <Description>English (AC3) (5.1 ch)</Description>
                        <Codec>2048</Codec>
                        <Bitrate>224000</Bitrate>
                    </ScannedTrack>
                </AudioTrack>
                <AudioTrack>
                    <MixDown>5point1</MixDown>
                    <Encoder>ffaac</Encoder>
                    <EncoderRateType>Bitrate</EncoderRateType>
                    <Bitrate>256</Bitrate>
                    <ScannedTrack>
                        <TrackNumber>5</TrackNumber>
                        <Description>English (DTS-HD MA) (5.1 ch)</Description>
                        <Codec>262144</Codec>
                        <Bitrate>1536000</Bitrate>
                    </ScannedTrack>
                </AudioTrack>
                <AudioTrack>
                    <MixDown>stereo</MixDown>
                    <Encoder>Lame</Encoder>
                    <EncoderRateType>Bitrate</EncoderRateType>
                    <Bitrate>256</Bitrate>
                    <ScannedTrack>
                        <TrackNumber>6</TrackNumber>
                        <Description>English (DTS) (5.1 ch)</Description>
                        <Codec>8192</Codec>
                        <Bitrate>1536000</Bitrate>
                    </ScannedTrack>
                </AudioTrack>
                <AudioTrack>
                    <MixDown>stereo</MixDown>
                    <Encoder>ffaac</Encoder>
                    <EncoderRateType>Bitrate</EncoderRateType>
                    <Bitrate>160</Bitrate>
                    <ScannedTrack>
                        <TrackNumber>7</TrackNumber>
                        <Description>TrueHD 5.1</Description>
                        <Codec>4444</Codec>
                        <Bitrate>1536000</Bitrate>
                    </ScannedTrack>
                </AudioTrack>
            </AudioTracks>
        </Task>
    </QueueTask>
</ArrayOfQueueTask>

А вот ожидаемый результатXML после примененных преобразований:

<?xml version="1.0"?>
<ArrayOfQueueTask xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <QueueTask>
        <Task>
            <AudioTracks>
                <AudioTrack>
                    <MixDown>5point1</MixDown>
                    <Encoder>EAc3</Encoder>
                    <EncoderRateType>Bitrate</EncoderRateType>
                    <Bitrate>448</Bitrate>
                    <ScannedTrack>
                        <TrackNumber>1</TrackNumber>
                        <Description>English (E-AC3) (5.1 ch)</Description>
                        <Codec>16777216</Codec>
                        <Bitrate>448000</Bitrate>
                    </ScannedTrack>
                </AudioTrack>
                <AudioTrack>
                    <Encoder>Ac3Passthrough</Encoder>
                    <EncoderRateType>Bitrate</EncoderRateType>
                    <Bitrate>192</Bitrate>
                    <ScannedTrack>
                        <TrackNumber>2</TrackNumber>
                        <Description>English (AC3) (5.1 ch)</Description>
                        <Codec>2048</Codec>
                        <Bitrate>192000</Bitrate>
                    </ScannedTrack>
                </AudioTrack>
                <AudioTrack>
                    <MixDown>stereo</MixDown>
                    <Encoder>Ac3</Encoder>
                    <EncoderRateType>Bitrate</EncoderRateType>
                    <Bitrate>192</Bitrate>
                    <ScannedTrack>
                        <TrackNumber>3</TrackNumber>
                        <Description>English (E-AC3) (5.1 ch)</Description>
                        <Codec>16777216</Codec>
                        <Bitrate>224000</Bitrate>
                    </ScannedTrack>
                </AudioTrack>
                <AudioTrack>
                    <MixDown>stereo</MixDown>
                    <Encoder>Ac3</Encoder>
                    <EncoderRateType>Bitrate</EncoderRateType>
                    <Bitrate>192</Bitrate>
                    <ScannedTrack>
                        <TrackNumber>4</TrackNumber>
                        <Description>English (AC3) (5.1 ch)</Description>
                        <Codec>2048</Codec>
                        <Bitrate>224000</Bitrate>
                    </ScannedTrack>
                </AudioTrack>
                <AudioTrack>
                    <MixDown>stereo</MixDown>
                    <Encoder>Ac3</Encoder>
                    <EncoderRateType>Bitrate</EncoderRateType>
                    <Bitrate>192</Bitrate>
                    <ScannedTrack>
                        <TrackNumber>5</TrackNumber>
                        <Description>English (DTS-HD MA) (5.1 ch)</Description>
                        <Codec>262144</Codec>
                        <Bitrate>1536000</Bitrate>
                    </ScannedTrack>
                </AudioTrack>
                <AudioTrack>
                    <MixDown>stereo</MixDown>
                    <Encoder>Ac3</Encoder>
                    <EncoderRateType>Bitrate</EncoderRateType>
                    <Bitrate>192</Bitrate>
                    <ScannedTrack>
                        <TrackNumber>6</TrackNumber>
                        <Description>English (DTS) (5.1 ch)</Description>
                        <Codec>8192</Codec>
                        <Bitrate>1536000</Bitrate>
                    </ScannedTrack>
                </AudioTrack>
                <AudioTrack>
                    <MixDown>stereo</MixDown>
                    <Encoder>Ac3</Encoder>
                    <EncoderRateType>Bitrate</EncoderRateType>
                    <Bitrate>192</Bitrate>
                    <ScannedTrack>
                        <TrackNumber>7</TrackNumber>
                        <Description>TrueHD 5.1</Description>
                        <Codec>4444</Codec>
                        <Bitrate>1536000</Bitrate>
                    </ScannedTrack>
                </AudioTrack>
            </AudioTracks>
        </Task>
    </QueueTask>
</ArrayOfQueueTask>

Заказатьисходного XML-файла:

<?xml version="1.0"?>
<ArrayOfQueueTask xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <QueueTask>
        <Task>
            <AudioTracks>
                <AudioTrack>
                    <IsNotifying>true</IsNotifying>
                    <DRC>0</DRC>
                    <Gain>0</Gain>
                    <MixDown>5point1</MixDown>
                    <Encoder>Ac3</Encoder>
                    <SampleRate>0</SampleRate>
                    <EncoderRateType>Bitrate</EncoderRateType>
                    <Bitrate>448</Bitrate>
                    <Quality>-1</Quality>
                    <TrackName/>
                    <IsDefault>false</IsDefault>
                    <SampleRateDisplayValue>Auto</SampleRateDisplayValue>
                    <ScannedTrack>
                        <TrackNumber>1</TrackNumber>
                        <Language>English</Language>
                        <LanguageCode>eng</LanguageCode>
                        <Description>English (E-AC3) (5.1 ch)</Description>
                        <Codec>16777216</Codec>
                        <SampleRate>48000</SampleRate>
                        <Bitrate>224000</Bitrate>
                        <ChannelLayout>128000</ChannelLayout>
                    </ScannedTrack>
                </AudioTrack>
            </AudioTracks>
        </Task>
    </QueueTask>
</ArrayOfQueueTask>

1 Ответ

2 голосов
/ 26 мая 2019

Это очень сложно и отнимает много времени. AFAICT, вы хотите сделать:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="AudioTrack[ScannedTrack/TrackNumber > 1 and ScannedTrack/Codec = 2048 and ScannedTrack/Bitrate &lt;= 192000]">
    <xsl:copy>
        <Encoder>Ac3Passthrough</Encoder>
        <xsl:apply-templates select="*[not(self::MixDown or self::Encoder)]"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="AudioTrack[ScannedTrack/TrackNumber > 1 and (ScannedTrack/Codec = 2048 or ScannedTrack/Codec = 262144 or ScannedTrack/Codec = 8192 or ScannedTrack/Codec = 4444) and ScannedTrack/Bitrate > 192000]">
    <xsl:copy>
        <MixDown>stereo</MixDown>
        <Encoder>Ac3</Encoder>
        <Bitrate>192</Bitrate>
        <xsl:apply-templates select="*[not(self::MixDown or self::Encoder or self::Bitrate)]"/>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

Добавлено в ответ на ваш комментарий:

Если вы хотите сохранить исходный порядок элементов в AudioTrack, попробуйте:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="AudioTrack[ScannedTrack/TrackNumber > 1 and ScannedTrack/Codec = 2048 and ScannedTrack/Bitrate &lt;= 192000]">
    <xsl:copy>
        <xsl:apply-templates select="IsNotifying | DRC | Gain"/>        
        <Encoder>Ac3Passthrough</Encoder>
        <xsl:apply-templates select="SampleRate | EncoderRateType | Bitrate | Quality | TrackName | IsDefault | SampleRateDisplayValue | ScannedTrack"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="AudioTrack[ScannedTrack/TrackNumber > 1 and (ScannedTrack/Codec = 2048 or ScannedTrack/Codec = 262144 or ScannedTrack/Codec = 8192 or ScannedTrack/Codec = 4444) and ScannedTrack/Bitrate > 192000]">
    <xsl:copy>
        <xsl:apply-templates select="IsNotifying | DRC | Gain"/>        
        <MixDown>stereo</MixDown>
        <Encoder>Ac3</Encoder>
        <xsl:apply-templates select="SampleRate | EncoderRateType"/>  
        <Bitrate>192</Bitrate>
        <xsl:apply-templates select="Quality | TrackName | IsDefault | SampleRateDisplayValue | ScannedTrack"/>      
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

Предполагается, что исходный заказ:

  • IsNotifying
  • DRC
  • Gain
  • MixDown
  • Кодер
  • SampleRate
  • EncoderRateType
  • Битрейт
  • Качество
  • TrackName
  • IsDefault
  • SampleRateDisplayValue
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...