【问题标题】:XSLT a flat list to a tree hierarchyXSLT 将平面列表转换为树层次结构
【发布时间】:2018-02-06 13:34:09
【问题描述】:

我最近遇到了一个尚未找到好的解决方案的问题。

给定一个具有平面层次结构的 XML 文件,并希望将其转换为定义的层次结构。

<xml_file>
<dd/>
<b/>
<b/>
<dd/>
<b/>
<b/>
<dd/>
<k/>
<b/>
<b/>
<dd/>
<b/>
<b/>
</xml_file>

我想把它变成什么:

<xml_file>
    <dd>
        <b/>
        <b/>
    </dd>
    <dd>
        <b/>
        <b/>
    </dd>
    <dd>
        <k>
           <b/>
           <b/>
        </k>
    </dd>
    <dd>
        <b/>
        <b/>
    </dd>
</xml_file>

使用 xslt 2.0 的最佳方法是什么?

非常感谢您的帮助。

编辑:

对不起。我真的没有很好地解释它..

我给定了一个元素列表,这些元素按列表中的顺序组织。

dd 之后的所有 b'sk's 都应该是前面 dd 的子代。 p>

k 之后的所有 b 的 都应该是前面 k 的子级。

【问题讨论】:

  • 您的 XML 样本是否真的代表了您的实际 XML?目前,它的格式不正确,因为(除了xml_file)没有任何标签具有关联的结束标签,这意味着 XSLT 将无法处理它。
  • 您需要解释“定义”层次结构的逻辑。
  • 感谢您的回复。我更新了我的问题的描述。
  • 使用嵌套的xsl:for-each-group group-starting-with 例如&lt;xsl:for-each-group select="*" group-starting-with="dd"&gt;&lt;xsl:copy&gt;&lt;xsl:for-each-group select="current-group() except ." group-starting-with="k"&gt;...

标签: xml xslt xpath transformation flat


【解决方案1】:

你可以使用

<xsl:template match="xml_file">
    <xsl:copy>
        <xsl:for-each-group select="*" group-starting-with="dd">
            <xsl:copy>
                <xsl:for-each-group select="current-group() except ." group-starting-with="k">
                    <xsl:choose>
                        <xsl:when test="self::k">
                            <xsl:copy>
                                <xsl:apply-templates select="current-group() except ."/>
                            </xsl:copy>
                        </xsl:when>
                        <xsl:otherwise>
                            <xsl:apply-templates select="current-group()"/>
                        </xsl:otherwise>
                    </xsl:choose>
                </xsl:for-each-group>
            </xsl:copy>
        </xsl:for-each-group>
    </xsl:copy>
</xsl:template>

加上身份转换模板。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    相关资源
    最近更新 更多