2016-03-23 15 views
0

Als Anfänger beim Schreiben von XSL's habe ich Problem, eine für mein aktuelles Projekt zu debuggen. EditX-XML schlägt einfach die Transformation für Fehler fehl, sagt aber nicht, wo sie sind.XSL-Transformation fehlgeschlagen und ich kann nicht sehen, warum

Jede beraten geschätzt

Quelle XML:

<soa:Label xmlns:soa="urn:telestream.net:soa:core" identifier="ac7af7e5-a536-40ae-b7ca-93e62009c86a" name="Duration - Timecode to Frames" description="" instance="dc07adf4-79e4-4d33-b740-ece5bc0af991" signature="00000000-0000-0000-0000-000000000000"> 
<soa:Parameter type="timecode" identifier="82795f2a-5a2e-41ca-b1da-0c35a9c584e4" bindable="True" name="Duration Timecode" enabled="true" disableable="false" optionseditable="false" row="-1" column="-1" columnspan="1">00:15:52:[email protected] 
<soa:Default>00:00:00:[email protected]</soa:Default> 
<soa:IsRequired>false</soa:IsRequired> 
</soa:Parameter> 
<soa:Parameter type="int32" identifier="ca643595-6cbb-46b4-bf9b-da93c4348a4e" bindable="True" name="Duration Frames" enabled="true" disableable="false" optionseditable="false" row="-1" column="-1" columnspan="1">0 
<soa:Default>0</soa:Default> 
<soa:IsRequired>false</soa:IsRequired> 
</soa:Parameter> 
</soa:Label> 

XSL:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:soa="urn:telestream.net:soa:core" version="2.0"> 
<xsl:analyze-string select="/soa:Label/soa:Parameter[1]" regex="^(\d+):(\d+):(\d+):(\d+)@(\d+)$"> 
<xsl:matching-substring><xsl:variable name="hours" select="xs:integer(regex-group(1))"/> 
<xsl:variable name="minutes" select="xs:integer(regex-group(2))"/> 
<xsl:variable name="seconds" select="xs:integer(regex-group(3))"/> 
<xsl:variable name="frames" select="xs:integer(regex-group(4))"/> 
<xsl:variable name="fps" select="xs:integer(regex-group(5))"/> 
<xsl:variable name="total-frames" select="$hours * 60 * 60 * $fps + $minutes * 60 * $fps + $seconds * $frames + $frames"/> 
</xsl:matching-substring> 
</xsl:analyze-string> 
<xsl:template match="/"> 
<soa:Label identifier="5f01d03f-f867-4a57-92e0-19d239a3582d" name="Duration - Timecode to Frames pt2" description="" instance="dc07adf4-79e4-4d33-b740-ece5bc0af991" signature="00000000-0000-0000-0000-000000000000" xmlns:soa="urn:telestream.net:soa:core"> 
<soa:Parameter type="timecode" identifier="82795f2a-5a2e-41ca-b1da-0c35a9c584e4" bindable="True" name="Duration Timecode" enabled="true" disableable="false" optionseditable="false" row="-1" column="-1" columnspan="1"> 
<xsl:value-of select="/soa:Label/soa:Parameter[1]"/> 
<soa:Default>00:00:00:[email protected]</soa:Default> 
<soa:IsRequired>false</soa:IsRequired> 
</soa:Parameter> 
<soa:Parameter type="int32" identifier="ca643595-6cbb-46b4-bf9b-da93c4348a4e" bindable="True" name="Duration Frames" enabled="true" disableable="false" optionseditable="false" row="-1" column="-1" columnspan="1"><xsl:value-of select="$total-frames"/><soa:Default>0</soa:Default> 
<soa:IsRequired>false</soa:IsRequired> 
</soa:Parameter> 
</soa:Label> 
</xsl:template> 
</xsl:stylesheet> 

Dank

Antwort

0

Wenn Sie bei http://xsltransform.net/ Ihre XSLT testen waren, werden Sie sehen, gibt es zwei Fehler mit Ihrem XSLT

  1. Element xsl:analyze-string ist nicht erlaubt ein Kind
    xsl:stylesheet
  2. Sie haben innerhalb
    dieser xsl:analyze-string eine total-frames Variable definiert sein, aber das bedeutet, dass es nur in ihrem Umfang mit ist der xsl:matching-substring Block, so dass es nicht referenzieren sonst wo.

Siehe http://xsltransform.net/pPzifqj für spezifische Details

Was Sie tun müssen, ist die xsl:analyze-string zu bewegen, sondern auch wickeln die xsl:variable Erklärung total-frames um ihn herum, so dass die Variable dann später in der Vorlage verwendet werden kann.

dieses XSLT Versuchen

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:xs="http://www.w3.org/2001/XMLSchema" 
       xmlns:soa="urn:telestream.net:soa:core" 
       version="2.0"> 
    <xsl:output method="xml" indent="yes" /> 

    <xsl:template match="/"> 
     <soa:Label identifier="5f01d03f-f867-4a57-92e0-19d239a3582d" name="Duration - Timecode to Frames pt2" description="" instance="dc07adf4-79e4-4d33-b740-ece5bc0af991" signature="00000000-0000-0000-0000-000000000000"> 
     <soa:Parameter type="timecode" identifier="82795f2a-5a2e-41ca-b1da-0c35a9c584e4" bindable="True" name="Duration Timecode" enabled="true" disableable="false" optionseditable="false" row="-1" column="-1" columnspan="1"> 
      <xsl:value-of select="normalize-space(/soa:Label/soa:Parameter[1]/text()[1])"/> 
      <soa:Default>00:00:00:[email protected]</soa:Default> 
      <soa:IsRequired>false</soa:IsRequired> 
     </soa:Parameter> 

     <xsl:variable name="total-frames"> 
      <xsl:analyze-string select="normalize-space(/soa:Label/soa:Parameter[1]/text()[1])" 
           regex="^(\d+):(\d+):(\d+):(\d+)@(\d+)$"> 
       <xsl:matching-substring> 
       <xsl:variable name="hours" select="xs:integer(regex-group(1))"/> 
       <xsl:variable name="minutes" select="xs:integer(regex-group(2))"/> 
       <xsl:variable name="seconds" select="xs:integer(regex-group(3))"/> 
       <xsl:variable name="frames" select="xs:integer(regex-group(4))"/> 
       <xsl:variable name="fps" select="xs:integer(regex-group(5))"/> 

       <xsl:value-of select="$hours * 60 * 60 * $fps + $minutes * 60 * $fps + $seconds * $frames + $frames"/> 
       </xsl:matching-substring> 
      </xsl:analyze-string> 
     </xsl:variable> 

     <soa:Parameter type="int32" identifier="ca643595-6cbb-46b4-bf9b-da93c4348a4e" bindable="True" name="Duration Frames" enabled="true" disableable="false" optionseditable="false" row="-1" column="-1" columnspan="1"> 
      <xsl:value-of select="$total-frames"/> 
      <soa:Default>0</soa:Default> 
      <soa:IsRequired>false</soa:IsRequired> 
     </soa:Parameter> 
     </soa:Label> 
    </xsl:template> 
</xsl:stylesheet> 

Beachten Sie auch, wo Sie soa:Parameter[1] Auswahl wurden diese auch alle Zeilenumbrüche in den Text aufgenommen haben würde, und weiß-Raumknoten, so dass Ihre regulären Ausdruck nicht abgestimmt hätte.

Nachdem Sie das gesagt haben, sieht es so aus, als würden Sie versuchen, einen Textwert an den zweiten Parameter anzufügen, der auf dem ersten basiert. In diesem Fall können Sie die XSLT-Identitätsvorlage verwenden.

dieses XSLT Versuchen zu

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:xs="http://www.w3.org/2001/XMLSchema" 
       xmlns:soa="urn:telestream.net:soa:core" 
       version="2.0"> 
    <xsl:output method="xml" indent="yes" /> 

    <xsl:template match="soa:Parameter[2]"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*"/> 
      <xsl:analyze-string select="normalize-space(/soa:Label/soa:Parameter[1]/text()[1])" 
           regex="^(\d+):(\d+):(\d+):(\d+)@(\d+)$"> 
       <xsl:matching-substring> 
       <xsl:variable name="hours" select="xs:integer(regex-group(1))"/> 
       <xsl:variable name="minutes" select="xs:integer(regex-group(2))"/> 
       <xsl:variable name="seconds" select="xs:integer(regex-group(3))"/> 
       <xsl:variable name="frames" select="xs:integer(regex-group(4))"/> 
       <xsl:variable name="fps" select="xs:integer(regex-group(5))"/> 

       <xsl:value-of select="$hours * 60 * 60 * $fps + $minutes * 60 * $fps + $seconds * $frames + $frames"/> 
       </xsl:matching-substring> 
      </xsl:analyze-string> 
      <xsl:apply-templates select="*"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 
+0

sehr viel Dank @ tim-c funktioniert ein Genuss. Und vielen Dank für den Link zur Validator-Site, sehr nützlich – azz2912

Verwandte Themen