2016-03-19 10 views
2

私はXSL変換を書くことに新しいですし、私は私がここ2 excamples持つXMLの特定の形式をカバーXSLを作成しようとしています:は若干異なるXMLフォーマットを可能にする汎用的なXSLを作成しようと

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<Programme xmlns="http://www.digitalproductionpartnership.co.uk/ns/as11/2012"> 
<Editorial xmlns=""> 
<SeriesTitle>Paul And Nicks Big American Food Trip Series 2</SeriesTitle> 
<ProgrammeTitle>Paul And Nicks Big American Food Trip</ProgrammeTitle> 
<EpisodeTitleNumber>Washington DC</EpisodeTitleNumber> 
<ProductionNumber>PRG86396_1</ProductionNumber> 
<Synopsis>Paul and Nick visit Washington DC to cook up an Ulster Scots meal for their guests.</Synopsis> 
<Originator>Waddell Media</Originator> 
<CopyrightYear>2015</CopyrightYear> 
</Editorial> 
<Technical xmlns=""> 
<ShimName>DPP V4.1 HD AVC-I AS-11</ShimName> 
<Video> 
    <PictureFormat>1080i50 16:9</PictureFormat> 
    <AFD>10</AFD> 
    <PictureRatio>16:9 (1.78:1)</PictureRatio> 
    <ProductPlacement>false</ProductPlacement> 
    <VideoComments> 
    </VideoComments> 
    <VideoBitRate unit="Mbps">100</VideoBitRate> 
    <VideoCodecParameters>High 4:2:2 [email protected]</VideoCodecParameters> 
</Video> 
<Audio> 
    <PrimaryAudioLanguage>eng</PrimaryAudioLanguage> 
    <SecondaryAudioLanguage>zxx</SecondaryAudioLanguage> 
    <TertiaryAudioLanguage>zxx</TertiaryAudioLanguage> 
    <AudioLoudnessStandard>_UKDPP_AUDIO_LOUDNESS_STANDARD_EBU_R_128</AudioLoudnessStandard> 
    <AudioComments> 
    </AudioComments> 
</Audio> 
<Timecodes> 
    <LineUpStart>09:58:00:00</LineUpStart> 
    <IdentClockStart>09:59:30:00</IdentClockStart> 
    <Parts> 
    <Part> 
     <PartNumber>1</PartNumber> 
     <PartTotal>3</PartTotal> 
     <PartSOM>10:00:00:00</PartSOM> 
     <PartDuration>00:10:46:00</PartDuration> 
    </Part> 
    <Part> 
     <PartNumber>2</PartNumber> 
     <PartTotal>3</PartTotal> 
     <PartSOM>10:12:00:00</PartSOM> 
     <PartDuration>00:11:34:00</PartDuration> 
    </Part> 
    <Part> 
     <PartNumber>3</PartNumber> 
     <PartTotal>3</PartTotal> 
     <PartSOM>10:24:38:15</PartSOM> 
     <PartDuration>00:00:20:20</PartDuration> 
    </Part> 
    </Parts> 
    <TotalNumberOfParts>3</TotalNumberOfParts> 
    <TotalProgrammeDuration>00:22:40:20</TotalProgrammeDuration> 
</Timecodes> 
<AccessServices> 
    <SigningPresent>No</SigningPresent> 
    <OpenCaptionsPresent> 
    </OpenCaptionsPresent> 
</AccessServices> 
<AdditionalNode> 
    <TextlessElementsExist>True</TextlessElementsExist> 
    <CompletionDate>11/02/2016 17:47:42</CompletionDate> 
    <ProgrammeHasText>eng</ProgrammeHasText> 
</AdditionalNode> 
<ContactInformation> 
    <ContactEmail>[email protected]</ContactEmail> 
</ContactInformation> 
</Technical> 
</Programme> 

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><Programme xmlns="http://www.digitalproductionpartnership.co.uk/ns/as11/2015"><Editorial><SeriesTitle>ART</SeriesTitle><ProgrammeTitle>Ep26 Col safe test</ProgrammeTitle><EpisodeTitleNumber>Ep26</EpisodeTitleNumber><ProductionNumber>FKRD991W/01</ProductionNumber><Synopsis>James and Charlie</Synopsis><Originator>STV Productions</Originator><CopyrightYear>2016</CopyrightYear></Editorial><Technical><ShimName>UK DPP HD</ShimName><ShimVersion>1.1</ShimVersion><Video><VideoBitRate unit="Mbps">100</VideoBitRate><VideoCodec>AVC-Intra 100</VideoCodec><VideoCodecParameters>High 4:2:2 [email protected]</VideoCodecParameters><PictureFormat>1080i50 16:9</PictureFormat><AFD>10</AFD><PictureRatio>16:9 (1.78:1)</PictureRatio><ThreeD>false</ThreeD><ProductPlacement>false</ProductPlacement><PSEPass>Yes</PSEPass><PSEManufacturer>Ofcom</PSEManufacturer><PSEVersion>2009</PSEVersion></Video><Audio><AudioSamplingFrequency unit="kHz">48</AudioSamplingFrequency><AudioBitDepth>24</AudioBitDepth><AudioCodecParameters>PCM</AudioCodecParameters><AudioTrackLayout>EBU R 48: 2a</AudioTrackLayout><PrimaryAudioLanguage>eng</PrimaryAudioLanguage><SecondaryAudioLanguage>zxx</SecondaryAudioLanguage><TertiaryAudioLanguage>zxx</TertiaryAudioLanguage><AudioLoudnessStandard>EBU R 128</AudioLoudnessStandard></Audio><Timecodes><LineUpStart>09:59:30:00</LineUpStart><IdentClockStart>09:59:50:00</IdentClockStart><Parts><Part><PartNumber>1</PartNumber><PartTotal>1</PartTotal><PartSOM>10:00:00:00</PartSOM><PartDuration>00:05:25:10</PartDuration></Part></Parts><TotalNumberOfParts>2</TotalNumberOfParts><TotalProgrammeDuration>00:05:25:10</TotalProgrammeDuration></Timecodes><AccessServices><AudioDescriptionPresent>false</AudioDescriptionPresent><ClosedCaptionsPresent>false</ClosedCaptionsPresent><OpenCaptionsPresent>false</OpenCaptionsPresent><SigningPresent>No</SigningPresent></AccessServices><Additional><CompletionDate>2016-01-11</CompletionDate><TextlessElementsExist>false</TextlessElementsExist><ProgrammeHasText>true</ProgrammeHasText><ProgrammeTextLanguage>eng</ProgrammeTextLanguage><AssociatedMediaFilename>Ep26 Col safe test.mxf</AssociatedMediaFilename><MediaChecksumType>MD5</MediaChecksumType><MediaChecksumValue></MediaChecksumValue></Additional><ContactInformation><ContactEmail>[email protected]</ContactEmail><ContactTelephoneNumber>01413003000</ContactTelephoneNumber></ContactInformation></Technical></Programme> 

が、私は部品の総数を抽出しようとしていますが、両方のために働くシングルXSLをしたい:

第二は、ここに示されています。私は下の図のように個別に動作するものを手に入れましたが、XPATHがXPATHを介して接頭辞を必要としている場合と、XPATHがそうでない場合の両方でXPATHが異なります。明らかにもう1つの問題は、両方のネームスペースがわずかに異なっていることです。それについても説明する方法はありますか?

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="//edx:Programme" xmlns:edx="http://www.digitalproductionpartnership.co.uk/ns/as11/2012"><xsl:value-of select="/edx:Programme/Technical/Timecodes/TotalNumberOfParts" /></xsl:template> 
</xsl:stylesheet> 

二XSLはここにある:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="//edx:Programme" xmlns:edx="http://www.digitalproductionpartnership.co.uk/ns/as11/2015"><xsl:value-of select="/edx:Programme/edx:Technical/edx:Timecodes/edx:TotalNumberOfParts" /></xsl:template> 
</xsl:stylesheet> 

だから、ただ、明確にするためにXMLをした両方のXMLのようにどんなにから部品の数を抽出するために、単一のXSLを書く方法がありますソースは両方で動作しますか?

が多く書かれたあなたは、単一のスタイルシートに(xsl:template上のローカル名前空間宣言で)両方のテンプレートを置く場合は、XSLTプロセッサは、入力フォーマットに一致するテンプレートを適用します

答えて

2

を高く評価しました。

0

非常に似ている2つの異なるXMLボキャブラリー(特に名前空間が異なる場合)を処理する必要がある場合、最も簡単な方法は、あるボキャブラリを他のボキャブラリに変換するトランスフォームを作成することです同じプロセスで両方の品種を処理しようとするのではなく、いくつかの共通フォーマットに変換します)。利点は、いったん変換コードを書いたら、再利用性が高く、2つの異なるフレーバーに再び対処する必要がないことです。

0

要素がバインドされている名前空間に関係なく、XPathの構造をより一般的に一致させることができ、要素のlocal-name()を一致させることができます。

XSLT 2.0:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="*:Programme"> 
    <xsl:value-of select="*:Technical/*:Timecodes/*:TotalNumberOfParts" /> 
    </xsl:template> 
</xsl:stylesheet> 

XSLT 1.0:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="*[local-name()='Programme']"> 
    <xsl:value-of select="*[local-name()='Technical']/*[local-name()='Timecodes']/ 
           *[local-name()='TotalNumberOfParts']" /> 
    </xsl:template> 
</xsl:stylesheet> 
関連する問題