XSLT将regex-group()值传递给变量并对其进行格式化

时间:2017-08-20 07:02:40

标签: xml xslt xslt-2.0 saxon

我还没有找到关于如何做到这一点的明确例子。 我想将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前面就像一个字符串。

2 个答案:

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