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>

在添加新的父节点时遇到困难。任何指示/帮助都非常感谢。

试试这个方式:

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

相关内容

  • 没有找到相关文章

最新更新