【问题标题】:XML - Delete nested element based on matching condition then rename remaining elements?XML - 根据匹配条件删除嵌套元素然后重命名剩余元素?
【发布时间】:2019-05-23 03:16:12
【问题描述】:

我有一个 XML 文件,我想根据匹配条件删除特定元素,然后重命名/重新编号剩余的元素。

<AudioTracks>整体可以包含多个不同的<ScannedTrack>和多个in内

<AudioTracks>
 <AudioTrack>
  <ScannedTrack>

包含读取的输入音轨

<AudioTracks>
 <AudioTrack>

包含输出的音频编码设置

我想根据输入进行以下更改:

If <ScannedTrack>
    <TrackNumber>1</TrackNumber> AND <Codec>262144</Codec>
AND If <ScannedTrack>
    <TrackNumber>2</TrackNumber> AND <Codec>8192</Codec>

然后删除&lt;AudioTrack&gt;元素,其中&lt;TrackNumber&gt;1

然后

IF <TrackNumber>2 exist rename as <TrackNumber>1
IF <TrackNumber>3 exist rename as <TrackNumber>2
IF <TrackNumber>4 exist rename as <TrackNumber>3

(等到无穷大)

即然后任何后续轨道向后移动 1 个轨道 ID(即原始轨道 3 现在变为新轨道 2,原始轨道 4 现在移动到新轨道 3 等)

任何人都可以根据上述要求提供修改 XML 文件的解决方案吗?

这是原始 XML 供参考:

<?xml version="1.0"?>
<ArrayOfQueueTask xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <QueueTask>
    <IsNotifying>true</IsNotifying>
    <ScannedSourcePath>C:\Temp\Example.mkv</ScannedSourcePath>
    <Status>Waiting</Status>
    <Task>
      <IsNotifying>true</IsNotifying>
      <ShowAdvancedTab>false</ShowAdvancedTab>
      <AudioTracks>
        <AudioTrack>
          <IsNotifying>true</IsNotifying>
          <DRC>0</DRC>
          <Gain>0</Gain>
          <MixDown>5point1</MixDown>
          <Encoder>Ac3</Encoder>
          <SampleRate>0</SampleRate>
          <EncoderRateType>Bitrate</EncoderRateType>
          <Bitrate>384</Bitrate>
          <Quality>0</Quality>
          <IsDefault>false</IsDefault>
          <SampleRateDisplayValue>Auto</SampleRateDisplayValue>
          <ScannedTrack>
            <TrackNumber>1</TrackNumber>
            <Language>English</Language>
            <LanguageCode>eng</LanguageCode>
            <Description>English (DTS-HD MA) (5.1 ch)</Description>
            <Codec>262144</Codec>
            <SampleRate>48000</SampleRate>
            <Bitrate>1</Bitrate>
            <ChannelLayout>1551</ChannelLayout>
          </ScannedTrack>
        </AudioTrack>
        <AudioTrack>
          <IsNotifying>true</IsNotifying>
          <DRC>0</DRC>
          <Gain>0</Gain>
          <MixDown>5point1</MixDown>
          <Encoder>Ac3</Encoder>
          <SampleRate>0</SampleRate>
          <EncoderRateType>Bitrate</EncoderRateType>
          <Bitrate>384</Bitrate>
          <Quality>0</Quality>
          <IsDefault>false</IsDefault>
          <SampleRateDisplayValue>Auto</SampleRateDisplayValue>
          <ScannedTrack>
            <TrackNumber>2</TrackNumber>
            <Language>English</Language>
            <LanguageCode>eng</LanguageCode>
            <Description>English (DTS) (5.1 ch)</Description>
            <Codec>8192</Codec>
            <SampleRate>48000</SampleRate>
            <Bitrate>1536000</Bitrate>
            <ChannelLayout>1551</ChannelLayout>
          </ScannedTrack>
        </AudioTrack>
        <AudioTrack>
          <IsNotifying>true</IsNotifying>
          <DRC>0</DRC>
          <Gain>0</Gain>
          <MixDown>5point1</MixDown>
          <Encoder>Ac3</Encoder>
          <SampleRate>48</SampleRate>
          <EncoderRateType>Bitrate</EncoderRateType>
          <Bitrate>384</Bitrate>
          <Quality xsi:nil="true" />
          <TrackName />
          <IsDefault>false</IsDefault>
          <SampleRateDisplayValue>48</SampleRateDisplayValue>
          <ScannedTrack>
            <TrackNumber>3</TrackNumber>
            <Language>English</Language>
            <LanguageCode>eng</LanguageCode>
            <Description>English (DTS-HD MA) (5.1 ch)</Description>
            <Codec>262144</Codec>
            <SampleRate>48000</SampleRate>
            <Bitrate>1</Bitrate>
            <ChannelLayout>1551</ChannelLayout>
          </ScannedTrack>
        </AudioTrack>
        <AudioTrack>
          <IsNotifying>true</IsNotifying>
          <DRC>0</DRC>
          <Gain>0</Gain>
          <MixDown>5point1</MixDown>
          <Encoder>Ac3</Encoder>
          <SampleRate>48</SampleRate>
          <EncoderRateType>Bitrate</EncoderRateType>
          <Bitrate>384</Bitrate>
          <Quality xsi:nil="true" />
          <TrackName />
          <IsDefault>false</IsDefault>
          <SampleRateDisplayValue>48</SampleRateDisplayValue>
          <ScannedTrack>
            <TrackNumber>4</TrackNumber>
            <Language>English</Language>
            <LanguageCode>eng</LanguageCode>
            <Description>English (DTS-HD MA) (5.1 ch)</Description>
            <Codec>262144</Codec>
            <SampleRate>48000</SampleRate>
            <Bitrate>1</Bitrate>
            <ChannelLayout>1551</ChannelLayout>
          </ScannedTrack>
        </AudioTrack>
      </AudioTracks>
      <SubtitleTracks>
        <SubtitleTrack>
          <IsNotifying>true</IsNotifying>
          <Burned>false</Burned>
          <Default>false</Default>
          <Forced>false</Forced>
          <SourceTrack>
            <SourceId>0</SourceId>
            <TrackNumber>1</TrackNumber>
            <Language>English [VOBSUB]</Language>
            <LanguageCode>eng</LanguageCode>
            <SubtitleType>VobSub</SubtitleType>
          </SourceTrack>
          <SrtOffset>0</SrtOffset>
          <SubtitleType>VobSub</SubtitleType>
        </SubtitleTrack>
        <SubtitleTrack>
          <IsNotifying>true</IsNotifying>
          <Burned>false</Burned>
          <Default>false</Default>
          <Forced>false</Forced>
          <SourceTrack>
            <SourceId>0</SourceId>
            <TrackNumber>2</TrackNumber>
            <Language>English [VOBSUB]</Language>
            <LanguageCode>eng</LanguageCode>
            <SubtitleType>VobSub</SubtitleType>
          </SourceTrack>
          <SrtOffset>0</SrtOffset>
          <SubtitleType>VobSub</SubtitleType>
        </SubtitleTrack>
      </SubtitleTracks>
      <Source>C:\Temp.mkv</Source>
      <Title>1</Title>
      <Angle>1</Angle>
      <PointToPointMode>Chapters</PointToPointMode>
      <StartPoint>1</StartPoint>
      <EndPoint>20</EndPoint>
      <Destination>C:\Temp\ExampleEncoded.mkv</Destination>
      <OutputFormat>Mkv</OutputFormat>
      <OptimizeMP4>false</OptimizeMP4>
      <IPod5GSupport>false</IPod5GSupport>
      <AlignAVStart>false</AlignAVStart>
      <Width>720</Width>
      <Height>404</Height>
      <MaxWidth xsi:nil="true" />
      <MaxHeight xsi:nil="true" />
      <Cropping>
        <Top>0</Top>
        <Bottom>0</Bottom>
        <Left>0</Left>
        <Right>0</Right>
      </Cropping>
      <HasCropping>false</HasCropping>
      <Anamorphic>Automatic</Anamorphic>
      <DisplayWidth>746</DisplayWidth>
      <KeepDisplayAspect>true</KeepDisplayAspect>
      <PixelAspectX>202</PixelAspectX>
      <PixelAspectY>195</PixelAspectY>
      <Modulus>2</Modulus>
      <DeinterlaceFilter>Off</DeinterlaceFilter>
      <CombDetect>Off</CombDetect>
      <CustomCombDetect />
      <Detelecine>Off</Detelecine>
      <CustomDetelecine />
      <Denoise>Off</Denoise>
      <DenoisePreset>Light</DenoisePreset>
      <DenoiseTune>None</DenoiseTune>
      <CustomDenoise />
      <Deblock>4</Deblock>
      <Grayscale>false</Grayscale>
      <Rotation>0</Rotation>
      <FlipVideo>false</FlipVideo>
      <Sharpen>Off</Sharpen>
      <SharpenPreset>
        <DisplayName>Medium</DisplayName>
        <Key>medium</Key>
      </SharpenPreset>
      <SharpenTune>
        <DisplayName>None</DisplayName>
        <Key>none</Key>
      </SharpenTune>
      <SharpenCustom />
      <VideoEncodeRateType>ConstantQuality</VideoEncodeRateType>
      <VideoEncoder>X264</VideoEncoder>
      <FramerateMode>VFR</FramerateMode>
      <Quality>19</Quality>
      <VideoBitrate xsi:nil="true" />
      <TwoPass>true</TwoPass>
      <TurboFirstPass>false</TurboFirstPass>
      <Framerate xsi:nil="true" />
      <AllowedPassthruOptions>
        <AudioAllowAACPass>true</AudioAllowAACPass>
        <AudioAllowAC3Pass>false</AudioAllowAC3Pass>
        <AudioAllowDTSHDPass>false</AudioAllowDTSHDPass>
        <AudioAllowDTSPass>false</AudioAllowDTSPass>
        <AudioAllowMP3Pass>true</AudioAllowMP3Pass>
        <AudioAllowTrueHDPass>false</AudioAllowTrueHDPass>
        <AudioAllowFlacPass>false</AudioAllowFlacPass>
        <AudioAllowEAC3Pass>false</AudioAllowEAC3Pass>
        <AudioEncoderFallback>Ac3</AudioEncoderFallback>
      </AllowedPassthruOptions>
      <IncludeChapterMarkers>true</IncludeChapterMarkers>
      <ChapterNames>
        <ChapterMarker>
          <IsNotifying>true</IsNotifying>
          <ChapterNumber>1</ChapterNumber>
          <Duration />
          <ChapterName>00:00:00.000</ChapterName>
        </ChapterMarker>
        <ChapterMarker>
          <IsNotifying>true</IsNotifying>
          <ChapterNumber>2</ChapterNumber>
          <Duration />
          <ChapterName>00:03:43.723</ChapterName>
        </ChapterMarker>
        <ChapterMarker>
          <IsNotifying>true</IsNotifying>
          <ChapterNumber>3</ChapterNumber>
          <Duration />
          <ChapterName>00:10:31.756</ChapterName>
        </ChapterMarker>
        <ChapterMarker>
          <IsNotifying>true</IsNotifying>
          <ChapterNumber>4</ChapterNumber>
          <Duration />
          <ChapterName>00:13:25.847</ChapterName>
        </ChapterMarker>
        <ChapterMarker>
          <IsNotifying>true</IsNotifying>
          <ChapterNumber>5</ChapterNumber>
          <Duration />
          <ChapterName>00:17:38.641</ChapterName>
        </ChapterMarker>
        <ChapterMarker>
          <IsNotifying>true</IsNotifying>
          <ChapterNumber>6</ChapterNumber>
          <Duration />
          <ChapterName>00:19:35.841</ChapterName>
        </ChapterMarker>
        <ChapterMarker>
          <IsNotifying>true</IsNotifying>
          <ChapterNumber>7</ChapterNumber>
          <Duration />
          <ChapterName>00:25:12.302</ChapterName>
        </ChapterMarker>
        <ChapterMarker>
          <IsNotifying>true</IsNotifying>
          <ChapterNumber>8</ChapterNumber>
          <Duration />
          <ChapterName>00:28:01.305</ChapterName>
        </ChapterMarker>
        <ChapterMarker>
          <IsNotifying>true</IsNotifying>
          <ChapterNumber>9</ChapterNumber>
          <Duration />
          <ChapterName>00:35:09.065</ChapterName>
        </ChapterMarker>
        <ChapterMarker>
          <IsNotifying>true</IsNotifying>
          <ChapterNumber>10</ChapterNumber>
          <Duration />
          <ChapterName>00:43:07.084</ChapterName>
        </ChapterMarker>
        <ChapterMarker>
          <IsNotifying>true</IsNotifying>
          <ChapterNumber>11</ChapterNumber>
          <Duration />
          <ChapterName>00:49:29.592</ChapterName>
        </ChapterMarker>
        <ChapterMarker>
          <IsNotifying>true</IsNotifying>
          <ChapterNumber>12</ChapterNumber>
          <Duration />
          <ChapterName>00:52:14.214</ChapterName>
        </ChapterMarker>
        <ChapterMarker>
          <IsNotifying>true</IsNotifying>
          <ChapterNumber>13</ChapterNumber>
          <Duration />
          <ChapterName>00:59:24.978</ChapterName>
        </ChapterMarker>
        <ChapterMarker>
          <IsNotifying>true</IsNotifying>
          <ChapterNumber>14</ChapterNumber>
          <Duration />
          <ChapterName>01:02:53.728</ChapterName>
        </ChapterMarker>
        <ChapterMarker>
          <IsNotifying>true</IsNotifying>
          <ChapterNumber>15</ChapterNumber>
          <Duration />
          <ChapterName>01:15:50.921</ChapterName>
        </ChapterMarker>
        <ChapterMarker>
          <IsNotifying>true</IsNotifying>
          <ChapterNumber>16</ChapterNumber>
          <Duration />
          <ChapterName>01:21:28.801</ChapterName>
        </ChapterMarker>
        <ChapterMarker>
          <IsNotifying>true</IsNotifying>
          <ChapterNumber>17</ChapterNumber>
          <Duration />
          <ChapterName>01:24:23.183</ChapterName>
        </ChapterMarker>
        <ChapterMarker>
          <IsNotifying>true</IsNotifying>
          <ChapterNumber>18</ChapterNumber>
          <Duration />
          <ChapterName>01:31:45.875</ChapterName>
        </ChapterMarker>
        <ChapterMarker>
          <IsNotifying>true</IsNotifying>
          <ChapterNumber>19</ChapterNumber>
          <Duration />
          <ChapterName>01:35:52.664</ChapterName>
        </ChapterMarker>
        <ChapterMarker>
          <IsNotifying>true</IsNotifying>
          <ChapterNumber>20</ChapterNumber>
          <Duration />
          <ChapterName>01:44:06.282</ChapterName>
        </ChapterMarker>
      </ChapterNames>
      <AdvancedEncoderOptions />
      <VideoProfile>
        <DisplayName>Auto</DisplayName>
        <ShortName>auto</ShortName>
      </VideoProfile>
      <VideoLevel>
        <DisplayName>Auto</DisplayName>
        <ShortName>auto</ShortName>
      </VideoLevel>
      <VideoPreset>
        <DisplayName>Fast</DisplayName>
        <ShortName>fast</ShortName>
      </VideoPreset>
      <VideoTunes />
      <ExtraAdvancedArguments>level=31</ExtraAdvancedArguments>
      <MetaData />
      <IsPreviewEncode>false</IsPreviewEncode>
      <PreviewEncodeDuration xsi:nil="true" />
      <PreviewEncodeStartAt xsi:nil="true" />
    </Task>
    <Configuration>
      <IsDvdNavDisabled>true</IsDvdNavDisabled>
      <EnableQuickSyncDecoding>false</EnableQuickSyncDecoding>
      <UseQSVDecodeForNonQSVEnc>false</UseQSVDecodeForNonQSVEnc>
      <ScalingMode>Lanczos</ScalingMode>
      <PreviewScanCount>10</PreviewScanCount>
      <Verbosity>2</Verbosity>
      <MinScanDuration>5</MinScanDuration>
      <SaveLogToCopyDirectory>false</SaveLogToCopyDirectory>
      <SaveLogWithVideo>false</SaveLogWithVideo>
      <SaveLogCopyDirectory />
      <RemoteServiceEnabled>false</RemoteServiceEnabled>
      <RemoteServicePort>8080</RemoteServicePort>
    </Configuration>
    <Statistics>
      <IsNotifying>true</IsNotifying>
      <StartTime>0001-01-01T00:00:00</StartTime>
      <EndTime>0001-01-01T00:00:00</EndTime>
      <FinalFileSize xsi:nil="true" />
    </Statistics>
  </QueueTask>
</ArrayOfQueueTask>

类似:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="#all"
    version="3.0">

  <xsl:mode on-match="TrackNumber = 1"/>

  <xsl:template match="AudioTrack[ScannedTrack[Codec = (262144, 8192)]]/Encoder">
      <xsl:delete>AudioTrack</xsl:copy>
  </xsl:template>

</xsl:stylesheet>

我的编码很差,但我也不知道如何为其余曲目运行 for 循环。

编辑:更正错误,修复 xml 文件

【问题讨论】:

  • 这个还是蛮难理解的。您的 XML(您应该将其减少到证明问题所需的最低限度)的轨道编号为 1、2、1、1。此外,您制定条件的方式也是模棱两可的。
  • 你的代码在哪里?照原样,这只是一个需求转储,它将照此关闭。
  • @michael.hor257k 修复了 TrackNumber 问题,现在是 1,2,3,4。 “删除 1 的 元素”不明确?这意味着删除整个 AudioTrack 元素和其中匹配/相关 TrackNumber 的所有节点。
  • @michael.hor257k 我也没有减少 XML,因为我之前在其他地方做了一个不同的问题,另一个用户建议我不应该这样做,因为我可能会在代码中进一步导致未实现的问题,所以最好保持完整。
  • @michael.hor257k 谢谢,我会看看这个。您能否也看到这个问题以了解类似但稍微困难的要求stackoverflow.com/questions/56268237

标签: regex xml xslt cmd vbscript


【解决方案1】:

考虑以下简化示例:

XML

<ArrayOfQueueTask>
  <QueueTask>
    <Task>
      <AudioTracks>
        <AudioTrack>
          <ScannedTrack>
            <TrackNumber>1</TrackNumber>
            <Description>A</Description>
            <Codec>262144</Codec>
          </ScannedTrack>
        </AudioTrack>
        <AudioTrack>
          <ScannedTrack>
            <TrackNumber>2</TrackNumber>
            <Description>B</Description>
            <Codec>8192</Codec>
          </ScannedTrack>
        </AudioTrack>
        <AudioTrack>
          <ScannedTrack>
            <TrackNumber>3</TrackNumber>
            <Description>C</Description>
            <Codec>262144</Codec>
          </ScannedTrack>
        </AudioTrack>
        <AudioTrack>
          <ScannedTrack>
            <TrackNumber>4</TrackNumber>
            <Description>D</Description>
           <Codec>262144</Codec>
          </ScannedTrack>
        </AudioTrack>
      </AudioTracks>
    </Task>
  </QueueTask>
</ArrayOfQueueTask>

XSLT 2.0

<xsl:stylesheet version="2.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="AudioTracks">
    <xsl:copy>
        <xsl:choose>
            <xsl:when test="AudioTrack[1]/ScannedTrack/Codec=262144 and AudioTrack[2]/ScannedTrack/Codec=8192">
                <xsl:apply-templates select="AudioTrack[position() > 1]">
                    <xsl:with-param name="remove-track1" select="1" tunnel="yes"/>
                </xsl:apply-templates>
            </xsl:when>
            <xsl:otherwise>
                <xsl:apply-templates/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:copy>
</xsl:template>

<xsl:template match="ScannedTrack/TrackNumber">
    <xsl:param name="remove-track1" select="0" tunnel="yes"/>
    <xsl:copy>
        <xsl:value-of select=". - $remove-track1" />
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

结果

<?xml version="1.0" encoding="UTF-8"?>
<ArrayOfQueueTask>
   <QueueTask>
      <Task>
         <AudioTracks>
            <AudioTrack>
               <ScannedTrack>
                  <TrackNumber>1</TrackNumber>
                  <Description>B</Description>
                  <Codec>8192</Codec>
               </ScannedTrack>
            </AudioTrack>
            <AudioTrack>
               <ScannedTrack>
                  <TrackNumber>2</TrackNumber>
                  <Description>C</Description>
                  <Codec>262144</Codec>
               </ScannedTrack>
            </AudioTrack>
            <AudioTrack>
               <ScannedTrack>
                  <TrackNumber>3</TrackNumber>
                  <Description>D</Description>
                  <Codec>262144</Codec>
               </ScannedTrack>
            </AudioTrack>
         </AudioTracks>
      </Task>
   </QueueTask>
</ArrayOfQueueTask>

演示https://xsltfiddle.liberty-development.net/ncdD7mQ

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-13
    • 2019-08-18
    • 2021-09-15
    • 2016-12-16
    • 1970-01-01
    相关资源
    最近更新 更多