我还没有找到关于如何做到这一点的明确例子。 我想将2个正则表达式组结果传递给变量里面的analyze-string,应该从十六进制转换为十进制。例如,取regex-group(2)= 2和regex-group(4)= 30,regex-group(4)应格式化为0.30两个值传递给变量让我们说$ rg2 $ rg4然后计算“($ rg4 * (100 div 60))+ $ rg2“”(0.30 *(100 div 60))+ 2“= 2.5。如果rg4 = 0.38,那么最终结果将是2.6333333333333333
<xsl:analyze-string select="sbtime/@stmerid" regex="([hm]<xsl:variable name="rg2" select="regex-group(2)"/>
<xsl:variable name="rg4" select="regex-group(4)"/>
<xsl:value-of select="((0.$rg4)*(100 div 60))+$rg2"/>
)([0-9]{{1,2}})([ew]{{1}})([0-9]{{0,2}})">
<xsl:matching-substring>
<xsl:choose>
<xsl:when test="regex-group(1) = 'm'">
<xsl:choose>
<xsl:when test="regex-group(3) = 'e'">
<xsl:text>-</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>+</xsl:text>
</xsl:otherwise>
</xsl:choose>
<xsl:choose>
<xsl:when test="regex-group(4) != ''">
<xsl:text>:</xsl:text>
<xsl:variable name="rg2" as="xs:float">{regex-group(2)}</xsl:variable>
<xsl:variable name="rg4" as="xs:float">fn:format-number({regex-group(4)},'#.##')</xsl:variable>
<xsl:value-of select="($rg4*(100 div 60))+$rg2"/>
</xsl:when>
<xsl:otherwise>
<xsl:number value="regex-group(2)" format="1"/>
</xsl:otherwise>
</xsl:choose>
<xsl:number value="regex-group(2)" format="1"/>
</xsl:when>
<xsl:otherwise>
<xsl:choose>
<xsl:when test="regex-group(3) = 'e'">
<xsl:text>-</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>+</xsl:text>
</xsl:otherwise>
</xsl:choose>
<xsl:if test="regex-group(1) = 'm'"><xsl:text>00:</xsl:text></xsl:if>
<xsl:number value="regex-group(2)" format="1"/>
<xsl:choose>
<xsl:when test="regex-group(4) != ''">
<xsl:text>:</xsl:text>
<xsl:number value="regex-group(4)" format="1"/>
</xsl:when>
<xsl:otherwise>
</xsl:otherwise>
</xsl:choose>
</xsl:otherwise>
</xsl:choose>
</xsl:matching-substring>
</xsl:analyze-string>
怎么做?可能有一个干净,快速的方式。 我不知道你是否必须在xslt中使用变量或者是否存在范围和转换值的问题。
编辑:我想我问这个问题是因为我最初尝试过这个问题:{{1}}
并在xmlspy中返回“不是x路径语法的有效实例” 我不知道如何处理数字和数学来添加“0”。在$ rg4前面就像一个字符串。
答案 0 :(得分:2)
将评估结果绑定到XPath表达式的语法(就像regex-group(2)
那样的函数调用)只是
<xsl:variable name="rg2" select="regex-group(2)"/>
<xsl:variable name="rg2" as="xs:float">{regex-group(2)}</xsl:variable>
可能会在设置expand-text="yes"
的XSLT 3.0中执行。
通常,如果你有一个字符串(比如regex-group()
返回的)并且需要一定数量的某个类型,则调用构造函数,例如
<xsl:variable name="rg2" select="xs:decimal(regex-group(2))"/>
对于算术运算($rg4*(100 div 60))+$rg2
,你需要两个数值,而format-number
会给你一个字符串,所以我想你宁愿定义
<xsl:variable name="rg4" select="xs:decimal(regex-group(4)) div 100"/>
答案 1 :(得分:2)
我没有设法完成你想要做的事情的全部细节,但是在你写作时
create
然后我认为你误解了变量在XSLT中的工作原理。变量是可以在需要表达式的地方使用的命名值,它们不是可以在文本中的任何位置替换的字符串(即,它们不是宏)。
如果$ rg4是字符串“30”并且您想要值0.30,那么您需要<xsl:value-of select="((0.$rg4)*(100 div 60))+$rg2"/>
0.$rg4