我正在使用XSL文件来转换一些嵌套的XML。我想将两层嵌套层次结构展平为两个对象列表,同时通过添加键来保留关系。
我已经设置了XSL,将每个父母的密钥分配给其子代,然后只输出子笔记。
源XML:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<parent>
<parent-id>1</parent-id>
<child>
<child-id>child_a</child-id>
</child>
</parent>
<parent>
<parent-id>2</parent-id>
<child>
<child-id>child_b</child-id>
</child>
</parent>
</root>
XSL:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="text()" />
<xsl:template match="root">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="root/*">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="child">
<xsl:copy>
<xsl:copy-of select="*"/>
<foreignkey><xsl:value-of select="ancestor::parent/parent-id"/></foreignkey>
</xsl:copy>
</xsl:template>
<xsl:template match="parent">
<xsl:copy>
<xsl:copy-of select="*"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
这看起来就像我想要的那样,但我也想添加父母(现在没有嵌套的孩子),如下所示:
<parent>
<parent-id>1</parent-id>
</parent>
<parent>
<parent-id>2</parent-id>
</parent>
我需要在XSL文件中添加什么才能让父母在孩子之前或之后输出?我可以输出一个或另一个,但不能同时输出。
答案 0 :(得分:1)
您可以在apply-templates
模板中使用root
两次:
<xsl:template match="root">
<xsl:copy>
<xsl:apply-templates select="parent"/>
<xsl:apply-templates select="parent/child"/>
</xsl:copy>
</xsl:template>
<xsl:template match="child">
<xsl:copy>
<xsl:copy-of select="*"/>
<foreignkey><xsl:value-of select="ancestor::parent/parent-id"/></foreignkey>
</xsl:copy>
</xsl:template>
<xsl:template match="parent">
<xsl:copy>
<xsl:copy-of select="parent-id"/>
</xsl:copy>
</xsl:template>
然后你会得到例如。
<root>
<parent>
<parent-id>1</parent-id>
</parent>
<parent>
<parent-id>2</parent-id>
</parent>
<child>
<child-id>child_a</child-id>
<foreignkey>1</foreignkey>
</child>
<child>
<child-id>child_b</child-id>
<foreignkey>2</foreignkey>
</child>
</root>