2017-03-15 4 views
-1

Mein aktuelles Stylesheet ist unten. Es sucht nach allen Knoten von <IMFile> und löscht diese untergeordneten Elemente. Ich würde gerne eine weitere Bedingung hinzufügen, aber ich bin mir nicht sicher, wie ich das machen soll.XSLT: Variable in XML speichern

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

Also unten sind zwei Abschnitte, die ich betrachten muss. Hauptsächlich muss ich nur wissen, wie man eine Variable bekommt und benutzt. Ich würde gerne in diesem Quellbereich suchen und 1 ID speichern, die verweist, wenn die src="Red_Box.png". Und wenden Sie diese Variable auf meinen Code an (ersetzt die @ Variable). Diese ID gibt das @src Attribut des Elements <IMFile> wieder.

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

Wenn ich das über 3 IMFile ich es wollen würde, sehen, dass zwei von ihnen die src verwenden = „6“ (die die ID des Quell Kind ist, das Red_Box.png verwendet). Und führen sie in beiden Systemen gelöscht: (!)

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

Was möchten Sie den gewünschten Ausgang aus? Und nebenbei, wo sind die 'Callout'-Elemente in Ihrem XML, die Sie herausfiltern möchten? A [mcve] wäre hilfreich (um Ihre Frage zu beantworten). – zx485

Antwort

1

Wenn ich vermute, richtig, Sie wollen, wie etwas zu tun ist:

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> 

Das Entfernen wird jeder IMFile Element, das über das key mit einem Source Element verbunden ist, dessen src Attribut "Red-Box.png" ist.


Demo (unter Verwendung eines wohlgeformten Eingang): http://xsltransform.net/ejivdJc

+0

Sie sind erstaunlich! Dies ist perfekt! Ich sehe nicht einmal, wie es nur den Red-Box.png ID-Wert bekommt, aber es funktioniert (für die wenigen Tests, die ich gemacht habe)! – Torewin

+1

Es funktioniert durch einen ** Schlüssel ** - was ein äußerst nützliches Werkzeug in der XSLT-Toolbox ist. Hier können Sie den 'src'-Wert der zugehörigen' Source' aus dem Kontext von 'IMFile'" sehen ". –