Удалить дочерний элемент, если совпадает текстовая строка - PullRequest
0 голосов
/ 21 июня 2019

Я пытаюсь удалить конкретную ветку <SubtitleTrack>, где <SubtitleType> содержит текст PGS

Я думаю, что я почти на месте, но я не знаю, как удалитьконкретная ветка SubtitleTrack.

Вот что у меня есть:

<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="SubtitleTracks">
    <xsl:copy>
        <xsl:choose>
            <xsl:when test="SubtitleTrack/SourceTrack/SubtitleType=PGS">
                [???]
            </xsl:when>
            <xsl:otherwise>
                <xsl:apply-templates/>
            </xsl:otherwise>
        </xsl:choose>
    </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>
    <IsNotifying>true</IsNotifying>
    <ScannedSourcePath>E:\TEMP\MyVideo.mkv</ScannedSourcePath>
    <Status>Waiting</Status>
    <Task>
      <IsNotifying>true</IsNotifying>
      <ShowAdvancedTab>false</ShowAdvancedTab>
      <SubtitleTracks>
        <SubtitleTrack>
          <IsNotifying>true</IsNotifying>
          <Burned>false</Burned>
          <Default>false</Default>
          <Forced>false</Forced>
          <SourceTrack>
            <SourceId>7</SourceId>
            <TrackNumber>1</TrackNumber>
            <Language>English [PGS]</Language>
            <LanguageCode>eng</LanguageCode>
            <SubtitleType>PGS</SubtitleType>
          </SourceTrack>
          <SrtOffset>0</SrtOffset>
          <SubtitleType>PGS</SubtitleType>
        </SubtitleTrack>
        <SubtitleTrack>
          <IsNotifying>true</IsNotifying>
          <Burned>false</Burned>
          <Default>false</Default>
          <Forced>false</Forced>
          <SourceTrack>
            <SourceId>4</SourceId>
            <TrackNumber>2</TrackNumber>
            <Language>English [UTF-8]</Language>
            <LanguageCode>eng</LanguageCode>
            <SubtitleType>UTF8Sub</SubtitleType>
          </SourceTrack>
          <SrtOffset>0</SrtOffset>
          <SubtitleType>UTF8Sub</SubtitleType>
        </SubtitleTrack>
      </SubtitleTracks>
      <Source>E:\TEMP\MyVideo.mkv</Source>
      <Destination>C:\TempOutput\MyVideoEncode.mkv</Destination>
      <OutputFormat>Mkv</OutputFormat>
      <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" />
  </QueueTask>
</ArrayOfQueueTask>

Спасибо залюбая помощь

Ответы [ 3 ]

1 голос
/ 21 июня 2019

В исходном xml отсутствует конечный тег Задача

<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="SubtitleTrack">    
    <xsl:choose>
        <xsl:when test="SourceTrack[not(contains(SubtitleType,'PGS'))]">
            <xsl:copy>
                <xsl:apply-templates/>
            </xsl:copy>
        </xsl:when>
    </xsl:choose>
</xsl:template>

</xsl:stylesheet>
1 голос
/ 21 июня 2019

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

<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="SubtitleTrack[SourceTrack/SubtitleType='PGS']"/>

</xsl:stylesheet>

Или не применять шаблоны к ним для начала:

<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="SubtitleTracks">
    <xsl:copy>
        <xsl:apply-templates select="*[not(self::SubtitleTrack[SourceTrack/SubtitleType='PGS'])]"/>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>
0 голосов
/ 21 июня 2019
only change following code:-

<xsl:when test="SubtitleTrack/SourceTrack/SubtitleType='PGS'">
...