加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何使用XSLT使用相关元素组重新格式化XML

发布时间:2020-12-16 22:49:37 所属栏目:百科 来源:网络整理
导读:我正在改进一些我通过使用XSLT进行清理而继承的 XML,但我正在努力解决一个问题.看起来像这样: rules if condition="equals" arg1="somevar" arg2="1"/ elseif condition="equals" arg1="somevar" arg2="2"/ elseif condition="equals" arg1="somevar" arg2=
我正在改进一些我通过使用XSLT进行清理而继承的 XML,但我正在努力解决一个问题.看起来像这样:

<rules>
        <if condition="equals" arg1="somevar" arg2="1"/>
        <elseif condition="equals" arg1="somevar" arg2="2"/>
        <elseif condition="equals" arg1="somevar" arg2="3"/>
        <else/>
        <if condition="equals" arg1="somevar" arg2="4"/>
        <else/>
    </rules>

这看起来很难用XSD验证,所以我想把它变成这样的东西 – 想法?

<rules>
        <conditionSet>
            <if condition="equals" arg1="somevar" arg2="1"/>
            <elseif condition="equals" arg1="somevar" arg2="2"/>
            <elseif condition="equals" arg1="somevar" arg2="3"/>
            <else/>
        </conditionSet>
        <conditionSet>
            <if condition="equals" arg1="somevar" arg2="4"/>
            <else/>
        </conditionSet>
    </rules>

解决方法

将elseif和else元素按其前面的if元素分组:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>
    <xsl:key name="block" match="elseif|else" 
             use="generate-id(preceding-sibling::if[1])"/>
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="rules">
        <xsl:copy>
            <xsl:apply-templates select="@*|
                    node()[not(self::elseif or self::else)]"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="if">
        <conditionSet>
            <xsl:copy>
                <xsl:apply-templates select="@*|node()"/>
            </xsl:copy>
            <xsl:apply-templates select="key('block',generate-id())"/>
        </conditionSet>
    </xsl:template>
</xsl:stylesheet>

此样式表生成请求的输出.

说明:xsl:key将每个if元素与其后面的相关元素相关联,以便稍后当我们匹配if时,我们可以简单地包装并复制整个集合.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读