如何使用XSLT将多个XML级别发送到输出

时间:2017-10-30 17:59:56

标签: xml xslt

我正在使用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文件中添加什么才能让父母在孩子之前或之后输出?我可以输出一个或另一个,但不能同时输出。

1 个答案:

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