2016-03-23 15 views
0

XSL'nin yazılması konusunda bir acemi olmak benim mevcut projem için hata ayıklama sorunu yaşıyorum. EditX-XML hatalar için dönüşümü başarısız olur, ancak nerede olduklarını söylemez.XSL dönüşümü başarısız ve neden göremiyorum

Herhangi bir tavsiye

takdir

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

Teşekkür

cevap

0

Eğer http://xsltransform.net/ adresinden XSLT test etmek olsaydı sen orada göreceksiniz iki XSLT

ile ilgili sorunlar
  1. Eleman xsl:analyze-string Sen
    bu xsl:analyze-string içinde total-frames değişken tanımladık ama bu sadece xsl:matching-substring blok ile kapsamında olduğu anlamına gelir
    xsl:stylesheet
  2. bir çocuk izin verilmez, bu yüzden başvuru yapamazsınız başka nerede.

değişken sonra şablonda daha sonra kullanılabilir, böylece ne yapmanız gereken, onun etrafında total-frames ait xsl:variable beyanı sarın da xsl:analyze-string hareket ama belirli ayrıntıları

için http://xsltransform.net/pPzifqj bakınız.

bu XSLT Ayrıca

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

Eğer normal ifade eşleşti olmazdı bu yüzden bu, hepsi çok metinde satır sonu ve white-space düğümleri dahil olurdu soa:Parameter[1] seçerek nereye not deneyin.

Bunu söyledikten sonra, yapmaya çalıştığınız gibi görünüyor, ilk parametreye göre ikinci Parametreye bir metin değeri eklemektir. Bu durumda, XSLT kimlik şablonunu kullanmanın avantajından yararlanabilirsiniz.

bir tedavi çalışır tim-c @ çok

<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

Çok teşekkürler bu XSLT deneyin. Ve doğrulayıcı siteye bağlantı için teşekkürler, çok yararlı – azz2912

İlgili konular