简单的 XSL 转换,用于从源 XML 中提取单个值



我正在尝试从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>

但是我得到的只是一张白纸?

我所需要的只是节目/技术/时间码中的时间码值(总节目持续时间)

我做错了什么?(我对此很陌生 - 如果你还不能再生)

J.

输入 XML 中的元素具有命名空间。您还需要在 XSLT 样式表中声明此命名空间 - 并在您提到的任何元素名称前面添加前缀。

命名空间是 XSLT 中的一个重要概念(与一般的 XML 技术一样),因此我建议您花一些时间了解基础知识。例如,从我以前的答案开始。

样式表

<?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>

您缺少命名空间声明:

<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>

相关内容

  • 没有找到相关文章

最新更新