使用XSLT转换展平嵌套的XML /层次结构

时间:2015-04-01 14:38:34

标签: xml xslt xpath soa

我有一个嵌套的层次结构xml结构,它将使用xsl转换展平。以下是该方案。

<company>
  <Managers>
    <Manager>
       <Name>Matt</Name>
       <ID>1</ID>
       <Manager>
          <Name>Joe</Name>
          <ID>11</ID>
          <Manager>
          <Name>Dave</Name>
          <ID>111</ID>
       </Manager>
       </Manager>
    </Manager>
    <Manager>
        <Name>mike</Name>
          <ID>2</ID>>
    </Manager>
  </Managers>
</company>

结果:

Matt 1
Joe 11
Dave 111
Mike 2

1 个答案:

答案 0 :(得分:1)

@Mathias Mueller的更好选择,

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="text" encoding="UTF-8"/>

    <xsl:template match="Manager">
        <xsl:value-of select="Name" />
        <xsl:text>: </xsl:text>
        <xsl:value-of select="ID" />
        <xsl:text> </xsl:text>
        <xsl:apply-templates/>
    </xsl:template>   

    <xsl:template match="text()"/>

</xsl:transform>

为什么这样更好:它会更恰当地控制文本输出(假设您确实希望将其输出为纯文本格式)。它也更加面向XSLT模板,与for-each循环相邻,往往更具可扩展性和可维护性。

使用descendant-or-self轴:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="text" doctype-public="XSLT-compat" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />

    <xsl:template match="//Managers">
       <xsl:for-each select="descendant-or-self::Manager">
        <xsl:value-of select="Name" />: <xsl:value-of select="ID" /><xsl:text> </xsl:text>
      </xsl:for-each>
    </xsl:template>    

</xsl:transform>

输出:

  Matt: 1 Joe: 11 Dave: 111 mike: 2 

http://xsltransform.net/nc4NzQB