如何使用XSLT 1.0省略嵌套圆括号内的字符串

问题描述 投票:2回答:1

我有一个节点

<statement> 
     SORBITOL, ARÔMES ARTIFICIELS, DIOXYDE DE SILICIUM, ASPARTAME (05 mg / PIECE (01 g)), ACESULFAME-POTASSIUM (03 mg / PIECE (01 g)), STEARATE DE MAGNESIUM. L'ASPARTAME CONTIENT DE LA PHENYLALANINE.
</statement>

我需要将其转换为:

<statement>SORBITOL, ARÔMES ARTIFICIELS, DIOXYDE DE SILICIUM, ASPARTAME , ACESULFAME-POTASSIUM , STEARATE DE MAGNESIUM. L'ASPARTAME CONTIENT DE LA PHENYLALANINE.</statement>

因此我需要一个函数来递归地提取除圆形括号内的字符串之外的所有文本,这样如果圆括号的更多嵌套存在,该函数应该通过省略括号和括号内的括号来返回字符串。我在XSLT 1.0版中需要它。

xslt-1.0
1个回答
0
投票

试试这个:

XSLT 1.0

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output indent="yes"/>
    <xsl:template match="statement">
        <xsl:copy>
            <xsl:call-template name="removeRoundBracket">
                <xsl:with-param name="data" select="normalize-space(.)"/>
            </xsl:call-template>
        </xsl:copy>
    </xsl:template>

    <xsl:template name="removeRoundBracket">
        <xsl:param name="data"/>
        <xsl:choose>
            <xsl:when test="contains(substring-before($data, ')'), '(')">
                <xsl:value-of select="substring-before($data, '(')"/>
                <xsl:call-template name="removeRoundBracket">
                    <xsl:with-param name="data" select="substring-after($data, ')')"/>
                </xsl:call-template>
            </xsl:when>
            <xsl:when test="contains($data, ')')">
                <xsl:call-template name="removeRoundBracket">
                    <xsl:with-param name="data" select="substring-after($data, ')')"/>
                </xsl:call-template>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="$data"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
</xsl:stylesheet>

请参阅http://xsltransform.net/93nvfck的转型

OUTPUT

<statement>SORBITOL, ARÔMES ARTIFICIELS, DIOXYDE DE SILICIUM, ASPARTAME , ACESULFAME-POTASSIUM , STEARATE DE MAGNESIUM. L'ASPARTAME CONTIENT DE LA PHENYLALANINE.</statement>
© www.soinside.com 2019 - 2024. All rights reserved.