使用xslt将xml元素组(包括子元素)向上移动到特定的层次结构级别

时间:2016-07-19 19:20:42

标签: xslt

我的目标是将元素标记移动到特定位置。一些帮助将不胜感激。

这是我的输入

    <?xml version="1.0" encoding="UTF-8"?>
<ROOT>
    <CHILD>
        <C.1>1</C.1>
        <C.2>something</C.2>
        <C.3>
            <A.1>AAA</A.1>
        </C.3>
    </CHILD>
    <CHILD.2>
        <ANOTHER.1>
            <ID_1>
                <PID.1>1</PID.1>
                <PID.2>
                    <CX.1>18</CX.1>
                    <CX.4>
                        <HD.1>HHH</HD.1>
                    </CX.4>
                    <CX.5>CCC</CX.5>
                </PID.2>
            </ID_1>
            <MOVEME>
                <ME.1>1</ME.1>
                <ME.2>
                    <M.1>10</M.1>
                    <M.2>some text string</M.2>
                </ME.2>
                <ME.3>MM</ME.3>
            </MOVEME>
            <ID_3/>
        </ANOTHER.1>
        <ANOTHER.2>
            <RC>
                <ORC.1>RR</ORC.1>
            </RC>
            <BR>
                <OBR.1>1</OBR.1>
                <OBR.2>
                    <EI.1>11</EI.1>
                    <EI.2>EIII</EI.2>
                </OBR.2>
            </BR>
            <BR.1/>
            <BR.2/>
        </ANOTHER.2>
    </CHILD.2>
    <CHILD.3/>
</ROOT>

期望的输出

<ROOT>
    <CHILD>...</CHILD>
    <CHILD.2>
        <ANOTHER.1>
            <ID_1>...</ID_1>

            //MOVEME IS NOW GONE
            <ID_3/>
        </ANOTHER.1>
        <ANOTHER.2>...</ANOTHER.2>
    </CHILD.2>
    <CHILD.3/>
    //DESTINATION WITH ALL IT ELEMENTS AND CONTENTS
    <MOVEME>
        <ME.1>1</ME.1>
        <ME.2>
            <M.1>10</M.1>
            <M.2>some text string</M.2>
        </ME.2>
        <ME.3>MM</ME.3>
    </MOVEME>
</ROOT>

到目前为止,它产生的输出却不太正确。它包括属于该特定标签的其他元素。我还在if语句中包含了不需要的标记,但它仍然无效。

我该如何避免?

<xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="ROOT/*">
        <xsl:for-each select="*">
            <xsl:if test="(name() != 'CHILD') and (name() != 'CHILD.2') and (name() != 'CHILD.3') and (name() != 'ANOTHER.2')" >
                <ZEI>
                        <xsl:apply-templates select="@* | node()"/>
                </ZEI>
            </xsl:if>
        </xsl:for-each>
    </xsl:template>

1 个答案:

答案 0 :(得分:0)

我不认为你的尝试在任何地方都是领先的。这里的想法是将“移动”节点添加到您想要的位置,并防止将其复制到原始位置:

XSLT 1.0


var elasticsearch = require('elasticsearch');
var client = new elasticsearch.Client({ host: 'localhost:9200',
                                       log: 'trace'});