Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex XSL转换失败,我可以';我不明白为什么_Regex_Xml_Xslt_Xslt 2.0 - Fatal编程技术网

Regex XSL转换失败,我可以';我不明白为什么

Regex XSL转换失败,我可以';我不明白为什么,regex,xml,xslt,xslt-2.0,Regex,Xml,Xslt,Xslt 2.0,作为编写XSL的新手,我在为当前项目调试XSL时遇到了问题。EditXXML只是因为错误而导致转换失败,但没有说明错误在哪里 有什么建议吗 源XML: <soa:Label xmlns:soa="urn:telestream.net:soa:core" identifier="ac7af7e5-a536-40ae-b7ca-93e62009c86a" name="Duration - Timecode to Frames" description="" instance="dc07adf4

作为编写XSL的新手,我在为当前项目调试XSL时遇到了问题。EditXXML只是因为错误而导致转换失败,但没有说明错误在哪里

有什么建议吗

源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:10@25
<soa:Default>00:00:00:00@29.97</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>

00:15:52:10@25
00:00:00:00@29.97
假的
0
0
假的
XSL:


00:00:00:00@29.97
假的
0
假的

谢谢

如果您在测试XSLT,您将看到XSLT有两个错误

  • 元素
    xsl:analyze string
    不允许是
    xsl:stylesheet
  • 您已在
    xsl:analyze string
    ,但这意味着它仅在
    xsl:matching子字符串
    块,因此无法引用它 在哪里
  • 有关具体细节,请参阅

    您需要做的是移动
    xsl:analyze字符串
    ,同时将
    xsl:variable
    声明的
    total frames
    包装在其周围,以便以后可以在模板中使用该变量

    试试这个XSLT

    <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:00@29.97</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>
    

    非常感谢@tim-c为您提供了优惠。谢谢你提供了到验证器站点的链接,非常有用
    <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:00@29.97</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>
    
    <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>