gpt4 book ai didi

xml - 如何使用 XSLT 重新格式化具有相关元素组的 XML

转载 作者:数据小太阳 更新时间:2023-10-29 02:11:19 26 4
gpt4 key购买 nike

我正在改进我继承的一些 XML,方法是使用 XSLT 来清理一些东西,但我在处理一个部分时遇到困难。看起来像这样:

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

最佳答案

elseifelse 元素按紧接在其前面的 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,我们可以简单地包装并复制整个集合。

关于xml - 如何使用 XSLT 重新格式化具有相关元素组的 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9086000/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com