简单的XSL转换从Source XML中提取单个值

时间:2014-02-14 16:23:57

标签: xslt xslt-1.0

我正在尝试从XML文档中检索某个值并将该值输出到新的XML文档中 - 源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)

我做错了什么? (我对此非常陌生 - 如果你不能回复的话)

学家

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分: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>