使用XSLT展平XML

时间:2013-12-17 16:30:19

标签: xml xslt

问题

输入:

<root>
    <node attr="nodeAttr">
        <node attr2="childNodeAttr">
            <node attr3="childChildNodeAttr">
                <item>...</item>
                ...
            </node>
        </node>
    </node> 
</root>

预期产出:

<root>
    <node attr="nodeAttr" attr2="childNodeAttr" attr3="childChildNodeAttr">
        <item>...</item>
        ...
    </node>
</root>

或者

<root>
    <node>
        <attr>nodeAttr</attr>
        <attr2>childNodeAttr</attr2>
        <attr3>childChildNodeAttr</attr3>
        <item>...</item>
        ...
    </node>
</root>

尝试

<xsl:for-each select="/root/node">
    <xsl:variable name="nodeAttribute" select="@attr" />
    <xsl:for-each select="/root/node/node">
        <xsl:variable name="nodeAttribute2" select="@attr2" />
        <xsl:for-each select="/root/node/node/node">
            <tr>
                <td>
                    <xsl:value-of select="$nodeAttribute"></xsl:value-of>
                </td>
                <td>
                    <xsl:value-of select="$nodeAttribute2"></xsl:value-of>
                </td>
                <td>
                    <xsl:value-of select="@attr3"></xsl:value-of>
                </td>
            </tr>
        </xsl:for-each>
    </xsl:for-each>
</xsl:for-each>

详情

我对XSLT很新,并且无法弄清楚如何使用它。显然,我的上述尝试并没有多大意义。

我已经阅读了几个例子,但是我遇到了更复杂的例子。除了W3C和w3school还有其他可以帮助我学习的好网站吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

你可以从这个样本中激励自己:

<xsl:template match="root">
  <xsl:copy>
    <xsl:apply-templates/>
  </xsl:copy>
</xsl:template>

<xsl:template match="root/node">
  <xsl:copy>
    <xsl:copy-of select="descendant-or-self::node/@*" />
    <xsl:copy-of select="descendant::item" />
  </xsl:copy>
</xsl:template>