2017-03-15 2 views
-1

私の現在のスタイルシートは以下の通りです。 <IMFile>のすべてのノードを探して、これらの子を削除します。私はそれに別の条件を追加したいと思いますが、私はこれを行う方法がわかりません。XSLT:変数をXMLに保存

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <!-- Removes red boxes --> 
    <xsl:template match="node()|@*"> 
     <xsl:copy> 
      <xsl:apply-templates select="node()|@*"/> 
     </xsl:copy> 
    </xsl:template> 

    <!-- Strip IMFile elements --> 
    <xsl:template match="IMFile[@src='@variable']"/> 
</xsl:stylesheet> 

ここでは、2つのセクションを見ていきます。主に変数を取得して使用する方法を知る必要があります。私はこのソースのセクションを見て、src="Red_Box.png"が参照する1 idを保存したいと思います。そして、この変数を自分のコードに適用します(@variableを置き換えます)。このIDは<IMFile>要素の@src属性を反映しています。

<SourceBin id="3" > 
    <Source id="4" src="something.trec" lastMod="20161202T191501" rect="(0,0,1920,1080)"> 
    <SourceTrack range="(0,9463)" type="0" editRate="30/1" trackRect="(0,0,1920,1080)" sampleRate="0/1" bitDepth="0" numChannels="0" filename="something.trec.trec!Strack0.tsc2" metaData="something.trec;" /> 
    </Source> 
    <Source id="5" src="screenshot_449.png" lastMod="20161202T191503" rect="(0,0,1912,1078)" > 
    <SourceTrack range="(0,1)" type="1" editRate="10000000/1" trackRect="(0,0,1912,1078)" sampleRate="0/1" bitDepth="24" numChannels="0" filename="" metaData="" /> 
    </Source> 
    <Source id="6" src="Red-Box.png" lastMod="20161202T191503" rect="(0,0,1600,1200)" > 
    <SourceTrack range="(0,1)" type="1" editRate="10000000/1" trackRect="(0,0,1600,1200)" sampleRate="0/1" bitDepth="32" numChannels="0" filename="" metaData="" /> 
    </Source> 
</SourceBin> 
    <IMFile id="6907" start="754" duration="8" scalar="1/1" mediaStart="0/1" mediaDuration="1/1" trackNumber="0" src="5" trimStartSum="67/1" > 
<IMFile id="6907" start="754" duration="8" scalar="1/1" mediaStart="0/1" mediaDuration="1/1" trackNumber="0" src="6" trimStartSum="67/1" > 
<IMFile id="6907" start="754" duration="8" scalar="1/1" mediaStart="0/1" mediaDuration="1/1" trackNumber="0" src="6" trimStartSum="67/1" > 

私は上記の3 IMFileを持っていた場合、私はそれが彼らの2は、SRC(Red_Box.pngを使用するソース子のIDです)=「6」を使用することを確認したいでしょう。そして、それらの両方の結果を削除:(!)私は推測していた場合は正しく、あなたのような何かをしたい

<IMFile id="6907" start="754" duration="8" scalar="1/1" mediaStart="0/1" mediaDuration="1/1" trackNumber="0" src="5" trimStartSum="67/1" > 
+0

何あなたの所望の出力は次のようになりますか?そして、btw。、あなたのXMLの 'Callout'要素はどこですか?あなたの質問に答えるには[mcve]が役に立ちます。 – zx485

答えて

1

を:

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:strip-space elements="*"/> 

<xsl:key name="source-by-id" match="Source" use="@id" /> 

<!-- identity transform --> 
<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

<!-- Strip IMFile elements --> 
<xsl:template match="IMFile[key('source-by-id', @src)/@src='Red-Box.png']"/> 

</xsl:stylesheet> 

これは、いずれかを削除しますIMFile要素は、src属性が"Red-Box.png"であるSource要素にリンクされています(key経由)。 (整形入力を使用して)


デモ:http://xsltransform.net/ejivdJc

+0

あなたは素晴らしいです!これは完璧です!私はそれがRed-Box.png id値だけを得る方法を見ていませんが、(私がやったいくつかのテストのために)うまくいきます! – Torewin

+1

XSLTツールボックスで非常に便利なツールである**キー**を介して動作します。ここでは、 'IMFile'の文脈から関連する' Source'の 'src'値を"見る "ことができます。 –

関連する問題