Regex XSL转换失败,我可以';我不明白为什么
作为编写XSL的新手,我在为当前项目调试XSL时遇到了问题。EditXXML只是因为错误而导致转换失败,但没有说明错误在哪里 有什么建议吗 源XML: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
<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>