转换XML嵌套

时间:2013-09-11 21:22:48

标签: xml xslt

我在XML / XSL方面处于领先地位。

我有一个如下所示的XML文件:

 <?xml version="1.0" encoding="ISO-8859-1"?>
<AllNames>
    <Tier2>
        <Binary>0</Binary>
        <Name>One</Name>
        <Tier3>
            <Tier4>
            <Key>1</Key>
            <Var2>Durp</Var2>
            </Tier4>
        </Tier3>
    </Tier2>
    <Tier2>
        <Binary>1</Binary>
        <Name>Two</Name>
        <Tier3>
            <Tier4>
            <Key>1</Key>
            <Var2>Durp</Var2>
            </Tier4>
        </Tier3>
        <Tier3>
            <Tier4>
            <Key>2</Key>
            <Var2>Durp Durp</Var2>
            </Tier4>
        </Tier3>
    </Tier2>
</Tier1>

我正在使用看起来像这样的XSL文件:

<?xml version="1.0" encoding="ISO-8859-1"?>

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
  <html>
  <body>
  <table>
    <tr bgcolor="#9acd32">
      <th>Name</th>
      <th>Key</th>
      <th>Var2</th>
    </tr>
    <xsl:for-each select="AllNames/Tier2">
    <tr>
      <td><xsl:value-of select="Name"/></td>
      <xsl:for-each select="Tier3/Tier4">
      <td><xsl:value-of select="Key"/></td>
      <td><xsl:value-of select="Var2"/></td>
      </xsl:for-each>
    </tr>
    </xsl:for-each>
  </table>
  </body>
  </html>
</xsl:template>

</xsl:stylesheet>

但我需要将主键/第一列设为“Key”。现在,具有多个Tier 3嵌套的元素将水平输出,即全部在一行中。我希望每个“密钥”都与相关数据在一起:

密钥名称Var2

1 One Durp

1两个Durp

2两个Durp Durp

1 个答案:

答案 0 :(得分:0)

Tier4元素创建模板以在表中创建行。当Tier4元素是上下文节点时,您可以轻松地对其KeyVar2个孩子进行处理,Name可以从其父级的父级获取。

在表格主模板的内部,使用<xsl:apply-templates/>“推送”Tier4元素,它们将匹配模板并为每个Tier4元素生成一行。

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

    <xsl:template match="/">
        <html>
            <body>
                <table>
                    <tr bgcolor="#9acd32">
                        <th>Key</th>
                        <th>Name</th>
                        <th>Var2</th>
                    </tr>
                    <xsl:apply-templates select="AllNames/Tier2/Tier3/Tier4"/>
                </table>
            </body>
        </html>
    </xsl:template>

    <xsl:template match="Tier4">
        <tr>
            <td><xsl:value-of select="Key"/></td>
            <td><xsl:value-of select="../../Name"/></td>
            <td><xsl:value-of select="Var2"/></td>
        </tr>
    </xsl:template>
</xsl:stylesheet>