XSLT 1.0 追踪 XML 对象的继承树

问题描述 投票:0回答:1
我正在编写一个 XSLT 以将 XML 模式转换为 python 类。该模式具有深入七到八个类的深层继承树,我需要从顶部开始编写输出,然后向下写入每个子类。我更喜欢在 XSLT 1.0 中执行此操作,因为我正在集成的工具似乎在 XSLT 2.0 中存在问题。

架构:

<?xml version="1.0" encoding="UTF-8"?> <catalog name="schema"> <Root name="ChildClassA"> <SuperType name="ParentClass"/> </Root> <Root name="ChildClassB"> <SuperType name="ParentClass"/> </Root> <Root name="ParentClass"> <SuperType name="GrandparentClass"/> </Root> <Root name="GrandparentClass"> </Root> </catalog>
所需输出:

class GrandparentClass(): "" class ParentClass(GrandparentClass): "" class ChildClassA(ParentClass): "" class ChildClassB(ParentClass): ""
我现有的转换能够将 GrandparentClass 排序为首先定义,但无法弄清楚 ParentClass 需要在 ChildClass 之前定义。

是否有1)一种使用递归

call-template name="supertype"

来追踪继承树的方法和2)一种检查ParentClass是否已被写入的方法?

xslt xslt-1.0
1个回答
0
投票
我不完全理解您预期输出的逻辑。尽管如此,使用

key重建层次树还是很容易的:

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:key name="item-by-parent" match="Root" use="SuperType/@name" /> <xsl:template match="/catalog"> <item name="{@name}"> <!-- select progenitors --> <xsl:apply-templates select="Root[not(SuperType)]"/> </item> </xsl:template> <xsl:template match="Root"> <item name="{@name}"> <!-- select children --> <xsl:apply-templates select="key('item-by-parent', @name)"/> </item> </xsl:template> </xsl:stylesheet>

结果

<?xml version="1.0" encoding="UTF-8"?> <item name="schema"> <item name="GrandparentClass"> <item name="ParentClass"> <item name="ChildClassA"/> <item name="ChildClassB"/> </item> </item> </item>
    
© www.soinside.com 2019 - 2024. All rights reserved.