在xslt中满足某些条件时复制节点两次

med*_*att 1 xml xslt

我有一个xslt问题,我希望有人可以提供帮助.我在父级下面有一个子节点列表.这些注释中的某些注释在括号中或使用左括号中都有一个字母.这意味着变体可以是"开"或"一",例如.

我想要做的是将它们分开,以便它们看起来像两个独立的元素,但我不太确定如何使用xslt.可能吗?

下面是一个例子,让您了解我正在使用的内容.

<forms>
    <variant>ane</variant>
    <variant>on</variant>
    <variant>o</variant>
    <variant>ane</variant>
    <variant>on(e</variant>
    <variant>o</variant>
    <variant>an(n)e</variant>
    <variant>æn(n)e</variant>
    <variant>en(n)e</variant>
    <variant>en</variant>
    <variant>ane</variant>
    <variant>on(e</variant>
    <variant>anne</variant>
    <variant>æn(n)e</variant>
    <variant>anre</variant>
    <variant>are</variant>
    <variant>hare</variant>
    <variant>ore</variant>
    <variant>anes</variant>
    <variant>æn(n)es</variant>
    <variant>en(n)es</variant>
</forms>
Run Code Online (Sandbox Code Playgroud)

理想情况下,完成后看起来会像这样.

<forms>
    <variant>ane</variant>
    <variant>on</variant>
    <variant>o</variant>
    <variant>ane</variant>
    <variant>on</variant>
    <variant>one</variant>
    <variant>o</variant>
    <variant>anne</variant>
    <variant>ane</variant>
    <variant>ænne</variant>
    <variant>æne</variant>
    <variant>ene</variant>
    <variant>enne</variant>
    <variant>en</variant>
    <variant>ane</variant>
    <variant>on</variant>
    <variant>one</variant>
    <variant>anne</variant>
    <variant>æne</variant>
    <variant>ænne</variant>            
    <variant>anre</variant>
    <variant>are</variant>
    <variant>hare</variant>
    <variant>ore</variant>
    <variant>anes</variant>
    <variant>ænnes</variant>
    <variant>ænes</variant>
    <variant>ennes</variant>
    <variant>enes</variant>
</forms>
Run Code Online (Sandbox Code Playgroud)

我可以很好地复制节点并在必要时抑制括号,但我不知道该怎么做是创建条件,当这些括号作为apply-templates命令的一部分存在时,它只会复制两次.

Eir*_*ndi 5

这归结为一些简单的逻辑来检查内容的字符串值<variant>,然后一些简单的逻辑来斩断字符串.

此处的示例代码也适用于XSLT 1.0.

<xsl:template match="/">
    <xsl:apply-templates/>
</xsl:template>

<xsl:template match="forms">
    <xsl:copy>
        <xsl:apply-templates/>
    </xsl:copy>
</xsl:template>

<xsl:template match="variant">
    <xsl:choose>
        <!-- Works in XSLT 1.0 -->
        <xsl:when test="contains(., '(')">
            <xsl:copy>
                <!-- Enter the shorter value, minus anything in the parentheses -->
                <xsl:value-of select="concat(substring-before(., '('), substring-after(., ')'))"/>
            </xsl:copy>
            <xsl:copy>
                <!-- Enter the full value, only excluding the parentheses -->
                <xsl:value-of select="translate(translate(., '(', ''), ')', '')"/>
            </xsl:copy>
        </xsl:when>
        <xsl:otherwise>
            <xsl:copy-of select="."/>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>
Run Code Online (Sandbox Code Playgroud)