架构:
<?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是否已被写入的方法?
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>