首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从源XML中提取单个值的简单XSL转换

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

Stack Overflow用户
提问于 2014-02-15 00:23:57
回答 2查看 357关注 0票数 0

我试图从XML文档中检索某个值,并将该值输出到一个新的XML文档中--源XML中充满了未使用的数据,我只需要特定的部分。

源XML :-

代码语言:javascript
复制
<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:

代码语言:javascript
复制
<?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)

我做错了什么?(我是个新手--如果你还不会的话)

J.

EN

回答 2

Stack Overflow用户

发布于 2014-02-15 00:31:43

输入XML中的元素有一个名称空间。还需要在XSLT样式表中声明这个名称空间,并在提到的任何元素名称前加上前缀。

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

样式表

代码语言:javascript
复制
<?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。然后,更有意义地设置

代码语言:javascript
复制
<xsl:output method="text">

代码语言:javascript
复制
<xsl:output method="html">

此外,indent="yes"只有在与html一起使用时才有意义,与文本一起使用时则没有意义。

下面是使用独立模板编写样式表的第二次尝试(这通常比使用xsl:for-each更好)。

样式表(更好的方法)

代码语言:javascript
复制
<?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>

输出

代码语言:javascript
复制
<html xmlns:dpp="http://www.digitalproductionpartnership.co.uk/ns/as11/2012">
   <body>
      <tr>
         <td>00:00:30:13</td>
      </tr>
   </body>
</html>
票数 2
EN

Stack Overflow用户

发布于 2014-02-15 00:31:08

您缺少命名空间声明:

代码语言:javascript
复制
<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>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21784416

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档