XSLT - 更改数字存在于text()节点中

时间:2016-01-15 07:13:18

标签: regex xml xslt xslt-2.0

我正在使用XSLT进行xml到xml的转换,我有一个如下的XML代码。

<section>
   <para>height 10cm, width 15cm</para>
   <para>height 20cm, width 15cm</para>
   <para>height 10cm, width 22cm</para>
</section>

这里我需要将输出中的高度和宽度值加倍。所以转换后的xml就是,

<section>
   <para>height 20cm, width 30cm</para>
   <para>height 40cm, width 30cm</para>
   <para>height 20cm, width 44cm</para>
</section>

我想过使用XSLT正则表达式来解决这个问题,并编写了以下模板,

<xsl:template match="para/text()">
        <xsl:variable name="elValue" select="."/>

        <xsl:analyze-string select="$elValue" regex="(\d{{5}}(\-\d{{4}})?)\s*">

            <xsl:matching-substring>
                <xsl:value-of select="number(regex-group(1))*2"/>
            </xsl:matching-substring>

            <xsl:non-matching-substring>
                <xsl:copy-of select="."/>
            </xsl:non-matching-substring>

        </xsl:analyze-string>
    </xsl:template>

但它没有按预期工作。

任何人都可以向我推荐一种方法,我怎样才能使para元素中的数字加倍?

1 个答案:

答案 0 :(得分:1)

我远不是一个正则表达式的高手,但这似乎对我有用:

<xsl:template match="para/text()">
    <xsl:analyze-string select="." regex="\d+">

    <xsl:matching-substring>
        <xsl:value-of select="2 * number(.)"/>
    </xsl:matching-substring>

    <xsl:non-matching-substring>
        <xsl:value-of select="."/>
    </xsl:non-matching-substring>

    </xsl:analyze-string>
</xsl:template>