XSLT 1.0-将某些元素移动到新的父级中

时间:2019-01-17 04:53:04

标签: xslt xslt-1.0

感谢您抽出宝贵时间来查看我的问题

我有一个看起来像这样的源xml

   <root>
    <a>asdf</a>
    <b>asdfdsaf</b>
    <c>adfasd</c>
    <d>asddf</d>
    <e></e>
    <others>
        <foo>sdfd</foo>
        <bar>hghg</bar>
    </others>
</root>

我需要将某些元素Eg:a,b,c包装到新的父元素中,并删除空元素。

如此输出

   <root>
    <newparent>
        <a>asdf</a>
        <b>asdfdsaf</b>
        <c>adfasd</c>
    </newparent>
    <d>asddf</d>
    <others>
        <foo>sdfd</foo>
        <bar>hghg</bar>
    </others>
</root>

我设法使用此XSL删除了空元素-

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:strip-space elements="*"/>
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="*[not(@*) and not(*) and (not(text()) or .=-1)]"/>

    <xsl:template match="name">


    </xsl:template>

</xsl:stylesheet>

被困于添加newparent节点。任何指针/帮助都非常感谢。

2 个答案:

答案 0 :(得分:1)

尝试一下:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

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

<xsl:template match="/root">
    <xsl:copy>
        <newparent>
            <xsl:apply-templates select="a|b|c"/>
        </newparent>
        <xsl:apply-templates select="*[not(self::a or self::b or self::c)]"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="*[not(@* or node())]"/>

</xsl:stylesheet>

答案 1 :(得分:0)

<xsl:template match="root">
        <xsl:copy>
            <newparent>
                <xsl:copy-of select="a|b|c"/>
             </newparent>
            <xsl:apply-templates/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="*[.= '' or name() ='a' or name()='b' or name()='c']"/>
check it if it is fullfill your requirement.