2014-02-14 2 views
0

Я пытаюсь получить определенное значение из документа XML и вывести это значение в новый XML-документ - исходный XML полон неиспользуемых данных, мне нужно только конкретное часть.Простой XSL-преобразование для извлечения единственного значения из исходного XML

Источник XML: -

<dpp:Programme xmlns:dpp="http://www.digitalproductionpartnership.co.uk/ns/as11/2012" xmlns:itv="http://dpp.itv.com/timecodes/v1"> 
<dpp:Editorial> 
<dpp:SeriesTitle>test</dpp:SeriesTitle> 
<dpp:ProgrammeTitle>test</dpp:ProgrammeTitle> 
<dpp:EpisodeTitleNumber>test</dpp:EpisodeTitleNumber> 
<dpp:ProductionNumber>2/1993/0022#001</dpp:ProductionNumber> 
<dpp:Synopsis>None</dpp:Synopsis> 
<dpp:Originator>None</dpp:Originator> 
<dpp:CopyrightYear>2013</dpp:CopyrightYear> 
</dpp:Editorial> 
<dpp:Technical> 
<dpp:ShimName>UK DPP HD</dpp:ShimName> 
<dpp:Video> 
<dpp:VideoBitRate unit="Mbps">100</dpp:VideoBitRate> 
<dpp:VideoCodec>AVCI</dpp:VideoCodec> 
<dpp:VideoCodecParameters>High 4:2:2 level 4.1</dpp:VideoCodecParameters> 
<dpp:PictureFormat>1080i50 16:9</dpp:PictureFormat> 
<dpp:AFD>10</dpp:AFD> 
<dpp:PictureRatio>16:9</dpp:PictureRatio> 
<dpp:ThreeD>false</dpp:ThreeD> 
<dpp:ProductPlacement>false</dpp:ProductPlacement> 
<dpp:FPAPass>Not tested</dpp:FPAPass> 
</dpp:Video> 
<dpp:Audio> 
<dpp:AudioSamplingFrequency unit="kHz">48</dpp:AudioSamplingFrequency> 
<dpp:AudioBitDepth>24</dpp:AudioBitDepth> 
<dpp:AudioCodecParameters>PCM</dpp:AudioCodecParameters> 
<dpp:AudioTrackLayout>EBU R 123: 4b</dpp:AudioTrackLayout> 
<dpp:PrimaryAudioLanguage>eng</dpp:PrimaryAudioLanguage> 
<dpp:SecondaryAudioLanguage>zxx</dpp:SecondaryAudioLanguage> 
<dpp:TertiaryAudioLanguage>eng</dpp:TertiaryAudioLanguage> 
<dpp:AudioLoudnessStandard>EBU R 128</dpp:AudioLoudnessStandard> 
</dpp:Audio> 
<dpp:Timecodes> 
<dpp:LineUpStart>09:58:00:00</dpp:LineUpStart> 
<dpp:IdentClockStart>09:59:20:00</dpp:IdentClockStart> 
<dpp:Parts> 
<dpp:Part> 
<dpp:PartNumber>1</dpp:PartNumber> 
<dpp:PartTotal>1</dpp:PartTotal> 
<dpp:PartSOM>10:30:41:11</dpp:PartSOM> 
<dpp:PartDuration>00:00:30:13</dpp:PartDuration> 
</dpp:Part> 
</dpp:Parts> 
<dpp:TotalNumberOfParts>1</dpp:TotalNumberOfParts> 
<dpp:TotalProgrammeDuration>00:00:30:13</dpp:TotalProgrammeDuration> 
</dpp:Timecodes> 
<dpp:AccessServices> 
<dpp:AudioDescriptionPresent>false</dpp:AudioDescriptionPresent> 
<dpp:ClosedCaptionsPresent>false</dpp:ClosedCaptionsPresent> 
<dpp:OpenCaptionsPresent>false</dpp:OpenCaptionsPresent> 
<dpp:SigningPresent>No</dpp:SigningPresent> 
</dpp:AccessServices> 
<dpp:Additional> 
<dpp:CompletionDate>2014-01-07</dpp:CompletionDate> 
<dpp:TextlessElementExist>false</dpp:TextlessElementExist> 
<dpp:ProgrammeHasText>true</dpp:ProgrammeHasText> 
<dpp:ProgrammeTextLanguage>eng</dpp:ProgrammeTextLanguage> 
<dpp:AssociatedMediaFilename>2-1993-0022-001.mxf</dpp:AssociatedMediaFilename> 
<dpp:MediaChecksumType>MD5</dpp:MediaChecksumType> 
<dpp:MediaChecksumValue>6154fd9cf312492e2dea68bee656ded7</dpp:MediaChecksumValue> 
</dpp:Additional> 
<dpp:ContactInformation> 
<dpp:ContactEmail>None</dpp:ContactEmail> 
<dpp:ContactTelephoneNumber>None</dpp:ContactTelephoneNumber> 
</dpp:ContactInformation> 
</dpp:Technical> 
<itv:AdditionalTimeCodes> 
<itv:Element> 
<itv:ElementType>Essence</itv:ElementType> 
<itv:ElementSOM>10:30:41:11</itv:ElementSOM> 
<itv:Duration>00:00:30:13</itv:Duration> 
<itv:Fade>false</itv:Fade> 
<itv:Mix>false</itv:Mix> 
<itv:Property>Essence</itv:Property> 
</itv:Element> 
</itv:AdditionalTimeCodes> 
</dpp:Programme> 

Это XSL я создал: -

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text" indent="yes"/> 
<xsl:template match="/"> 
    <html> 
     <body> 


      <xsl:for-each select="Programme/Technical/Timecodes"> 
       <tr> 
        <td> 
         <xsl:value-of select="TotalProgrammeDuration"/> 

        </td> 
       </tr> 
      </xsl:for-each> 

     </body> 
    </html> 
</xsl:template> 
</xsl:stylesheet> 

Но я получаю возвращается пустая страница?

Все, что мне нужно, это значение таймкода (TotalProgrammeDuration) из программы/Технические/таймкодов

Что я делаю неправильно? (Я новичок в этом - если вы не можете Rell уже)

J.

ответ

1

Вы не хватаете объявление пространства имен:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:dpp="http://www.digitalproductionpartnership.co.uk/ns/as11/2012" exclude-result-prefixes="dpp"> 
<xsl:output method="html" indent="yes"/> 
<xsl:template match="/"> 
    <html> 
     <body> 
      <xsl:for-each select="dpp:Programme/dpp:Technical/dpp:Timecodes"> 
       <tr> 
        <td> 
         <xsl:value-of select="dpp:TotalProgrammeDuration"/> 
        </td> 
       </tr> 
      </xsl:for-each> 
     </body> 
    </html> 
</xsl:template> 
</xsl:stylesheet> 
+0

Спасибо - Не могли бы вы посоветовать, как выводить как таймкодом, а не просто текст? – user3310957

+0

Я тебя не понял. Вы хотите добавить весь узел TimeCodes? –

2

Элементы вашего входного XML имеет имен. Вы также должны объявить это пространство имен в своей таблице стилей XSLT - и префикс любых имен элементов, которые вы упоминаете.

Пространства имен являются важной концепцией в XSLT (как и в случае с XML-технологиями в целом), поэтому я рекомендую вам потратить некоторое время на понимание основ. Например, начните с previous answer of mine.

стилевых

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:dpp="http://www.digitalproductionpartnership.co.uk/ns/as11/2012"> 
<xsl:output method="text" indent="yes"/> 
<xsl:template match="/"> 
    <html> 
     <body> 
      <xsl:for-each select="dpp:Programme/dpp:Technical/dpp:Timecodes"> 
       <tr> 
        <td> 
         <xsl:value-of select="dpp:TotalProgrammeDuration"/> 
        </td> 
       </tr> 
      </xsl:for-each> 
     </body> 
    </html> 
</xsl:template> 
</xsl:stylesheet> 

отметить также, что вы, очевидно, вывода XHTML. Тогда это имеет смысл установить

<xsl:output method="text"> 

в

<xsl:output method="html"> 

Кроме того, indent="yes" имеет смысл только при использовании HTML, а не с текстом.

Ниже приведена вторая попытка написать таблицу стилей, в которой используются отдельные шаблоны (что обычно лучше, чем использование xsl:for-each).

стилевых (лучший подход)

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:dpp="http://www.digitalproductionpartnership.co.uk/ns/as11/2012"> 

    <xsl:output method="html" indent="yes"/> 

    <xsl:template match="/"> 
     <html> 
     <body> 
      <xsl:apply-templates/> 
     </body> 
     </html> 
    </xsl:template> 

    <xsl:template match="dpp:Timecodes"> 
     <tr> 
     <td> 
      <xsl:value-of select="dpp:TotalProgrammeDuration"/> 
     </td> 
     </tr> 
    </xsl:template> 

    <xsl:template match="text()"/> 

</xsl:stylesheet> 

Выход

<html xmlns:dpp="http://www.digitalproductionpartnership.co.uk/ns/as11/2012"> 
    <body> 
     <tr> 
     <td>00:00:30:13</td> 
     </tr> 
    </body> 
</html> 
+0

+1 для хорошего подхода push, но я бы также добавил 'exclude-result-prefixes =" dpp "' to 'xsl: stylesheet'. –

Смежные вопросы