Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 在xslt中满足某些条件时复制节点两次_Xml_Xslt - Fatal编程技术网

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

Xml 在xslt中满足某些条件时复制节点两次,xml,xslt,Xml,Xslt,我有一个xslt问题,希望有人能帮助解决。我在父节点下有一个子节点列表。这些注释中的某些注释在括号内或带开括号内都有字母。这意味着变体可以是“开”或“一”,例如 我想做的是将它们分开,以便它们显示为两个单独的元素,但我不太确定如何使用xslt实现这一点。可能吗 下面是一个例子,让您了解我的工作内容 <forms> <variant>ane</variant> <variant>on</variant> <v

我有一个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>

电子邮箱
在…上
o
电子邮箱
在(e)上
o
安(n)e
æn(n)e
en(n)e
EN
电子邮箱
在(e)上
安妮
æn(n)e
安雷
是
野兔
矿石
阿纳斯
æn(n)es
en(n)es
理想情况下,完成后会像这样

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

电子邮箱
在…上
o
电子邮箱
在…上
一
o
安妮
电子邮箱
ænne
æne
烯
埃纳
EN
电子邮箱
在…上
一
安妮
æne
ænne
安雷
是
野兔
矿石
阿纳斯
ænnes
ænes
埃内斯
埃内斯

我可以很好地复制节点并在必要时抑制括号,但我不知道如何创建条件,当这些括号作为apply templates命令的一部分存在时,它将只复制两次。

这归结为一些简单的逻辑来检查
内容的字符串值,然后如此给我一个简单的逻辑来切碎绳子

这里的示例代码也适用于XSLT1.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>

这归结为一些简单的逻辑来检查
内容的字符串值,然后是一些简单的逻辑来适当地切碎字符串

这里的示例代码也适用于XSLT1.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>


我认为复制两次的逻辑不属于
应用模板
,它属于您的模板,例如
。您使用的是XSLT 2.0处理器吗?是的,我是。我使用的是Saxon 9.6.0.7。我注意到您列表中有一些冗余项。是否要保留它们?消除重复并不困难。我不知道墨迹复制两次的逻辑属于
应用模板
,它属于你的模板,例如
。你使用的是XSLT 2.0处理器吗?是的,我使用的是Saxon 9.6.0.7。我注意到你列表中有一些冗余项。你想保留它们吗?重复数据消除并不困难。非常感谢!我真的很高兴欣赏它,你是对的,这很简单。我不知道为什么我没有想到它。@medievalmatt,re:为什么,我个人有很多没有看到简单解决方案的经验。:)很多时候归结于在任何特定的习语中花费的时间,比如XSL、Python、C++等等。不同的方法,不同的思维方式。非常感谢。我真的很感激,你是对的,这很简单。我不知道为什么我没有想到它。“为什么,我有很多个人经验,没有看到简单的解决办法。”NS:)很多都归结为在任何特定的习语中花费的时间,如XSL、Python、C++等。不同的方法,不同的思维方式。