2017-01-27 10 views
0

こんにちは私は、セグメント番号順に時間のタイムコードの値を抽出しようとしています。ここで数値によるXSLT値

は私の入力XMLの例です。

<Container> 
    <Properties outputFileSegment-1-durationTimeCode="00:00:59;28" outputFileSegment-1-durationTotalFrames="1798" outputFileSegment-1-endTimeCode="00:59:39;29" outputFileSegment-1-endTimeCodeMediaflex="00:59:40;00" outputFileSegment-1-endTotalFrames="107291" outputFileSegment-1-endTotalFramesMediaflex="107292" outputFileSegment-1-segmentType="12" outputFileSegment-1-startTimeCode="00:58:40;00" outputFileSegment-1-startTotalFrames="105494" outputFileSegment-2-durationTimeCode="00:00:17;28" outputFileSegment-2-durationTotalFrames="540" outputFileSegment-2-endTimeCode="00:59:57;29" outputFileSegment-2-endTimeCodeMediaflex="00:59:58;00" outputFileSegment-2-endTotalFrames="107831" outputFileSegment-2-endTotalFramesMediaflex="107832" outputFileSegment-2-segmentType="8" outputFileSegment-2-startTimeCode="00:59:40;00" outputFileSegment-2-startTotalFrames="107292" outputFileSegment-3-durationTimeCode="00:09:06;17" outputFileSegment-3-durationTotalFrames="16379" outputFileSegment-3-endTimeCode="01:09:06;06" outputFileSegment-3-endTimeCodeMediaflex="01:09:06;20" outputFileSegment-3-endTotalFrames="124260" outputFileSegment-3-endTotalFramesMediaflex="124261" outputFileSegment-3-segmentType="63" outputFileSegment-3-startTimeCode="00:59:59;20" outputFileSegment-3-startTotalFrames="107882" /> 
</Container> 

私は何を達成しようとすると、この出力に類似の最終形式です:

<segment> 
    <segment_sequence_number>1</segment_sequence_number> 
    <segment_length>00:00:59;28</segment_length> 
</segment> 
<segment> 
    <segment_sequence_number>2</segment_sequence_number> 
    <segment_length>00:00:17;28</segment_length> 
</segment> 
<segment> 
    <segment_sequence_number>3</segment_sequence_number> 
    <segment_length>00:09:06;17</segment_length> 
</segment> 

私が行うので、私はこの時点で立ち往生しています最後のセグメントまで順番に各期間の値を抽出するためにxslt 1.0で書く方法を知らない。誰かが私が正しい軌道に乗るのを助けてくれますか?ここで

+1

変換に必要なロジックを説明してください。固定数のセグメントはありますか?または少なくともセグメントの最大数?出力に最初の2つのセグメントだけが含まれていますが、3番目のセグメントは含まれていないのはなぜですか?そして、セグメントの長さをどのように計算すればよいですか(あなたの入力にフレームレートはありません)? –

+0

固定数のセグメントがないので、最後のセグメント(4セグメントか25セグメントか)までの継続時間を出力する変換を見つける必要があります。出力は作成する必要のある例ですが、この特定の入力の正確な出力ではありません。フレームレートを使用して計算する必要はありません。それはすでに私のために行われています。 segment_lengthを満たすには、durationTimeCode値を使用するだけです。 – user6391187

+0

私は、すべてのセグメント*が 'durationTimeCode'を持っているのを見ません。そして、持っているものはあなたの出力のものとは異なる値を持っています。あなたの質問はすでに十分に難しいです。理解しやすくしてください。 - XSLT 2.0を使用できるかどうかを明記してください。 –

答えて

0

は、あなたがそれを見ることができる一つの方法です:あなたはひどくなどを見ると

XSLT 1.0

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

<xsl:template match="/Container"> 
    <segments> 
     <xsl:for-each select="Properties/@*[substring-after(substring-after(name(), '-'), '-')='durationTimeCode']"> 
      <segment> 
       <segment_sequence_number> 
        <xsl:value-of select="substring-before(substring-after(name(), '-'), '-')" /> 
       </segment_sequence_number> 
       <segment_length> 
        <xsl:value-of select="." /> 
       </segment_length> 
      </segment> 
     </xsl:for-each> 
    </segments> 
</xsl:template> 

</xsl:stylesheet> 
+0

私はXSLTの新機能です。このテンプレートをXSLTの別の場所に適用する必要がありますか?私はあなたの情報を使用していますが、まだ値が出ていませんunformatunaly – user6391187

+0

@ user6391187これは完全なXSLTスタイルシートです。あなたの入力XML構造はあなたが上に掲示したものと全く同じであると想定しています。あなたが扱うべき他のノードがあるなら、それをあなたのスタイルシートに適応させる必要があります - そして、大きな絵を見ることなくあなたを助けることはできません。 –

0

は、一般的には、このような属性を構造化しているためにXMLを使用してのわいせつな方法だと、設計されたXMLを実行するには、まずXMLを良いXMLに変換してから、実際のロジックに対して適切なXMLを処理することが最善の方法です。この入力に対しては、次のような形式に変換することから始めます。

<Container> 
    <Properties> 
     <segment nr="1"> 
      <durationTimeCode>00:00:59;28</durationTimeCode> 
      <durationTotalFrames>1798</durationTotalFrames> 
      <endTimeCode>00:59:39;29</endTimeCode> 
      ... 
     </segment> 
     <segment nr="2"> 
      ... 
     </segment> 
    </Properties> 
</Container> 

このクリーンアップは、次のテンプレートルールを使用して行うことができます。 XSLT 2.0はグループ化と文字列のマッチングが必要なので、実際には1.0でそれに取り組むことができません。本当に必要な場合は、自分自身でMuenchianの訓練をやりましょう。

<xsl:template match="Properties"> 
    <Properties> 
    <xsl:for-each-group select="@*" group-by="replace(name(), '[-A-Za-z]', '')"> 
     <segment nr="{current-grouping-key()}"> 
     <xsl:for-each select="current-group()"> 
      <xsl:element name="replace(name(), '^[A-Za-z]-[0-9]-', '')"> 
      <xsl:value-of select="."/> 
      </xsl:element> 
     </xsl:for-each> 
     </segment> 
    </xsl:for-each-group> 
    </Properties> 
</xsl:template> 

これは私の人生ではじめて要素の属性をグループ化したと思います。これは、このXML入力がどれほど奇妙であるかの尺度です。