XSLT使用同一父节点中的子节点生成表

XSLT使用同一父节点中的子节点生成表,xslt,html-table,Xslt,Html Table,我需要从一个父节点生成一个表 被截断的XML如下所示: <persons> <name>John</name> <age>30</age> <city>London</city> <name>Jake</name> <age>28</age> <city>New York</city> <

我需要从一个父节点生成一个表

被截断的XML如下所示:

<persons>
    <name>John</name>
    <age>30</age>
    <city>London</city>
    <name>Jake</name>
    <age>28</age>
    <city>New York</city>
</persons>

约翰
30
伦敦
满意的
28
纽约
但有时情况可能是这样的:

<persons>
    <name>John</name>
    <age>30</age>
    <name>Jake</name>
    <age>28</age>
</persons>

约翰
30
满意的
28
对于这两种情况,生成的表应该是相同的,如下所示:

<table>
    <tbody>
        <tr>
            <th>Name</th>
            <th>Age</th>
            <th>City</th>
        </tr>
        <tr>
            <td>John</td>
            <td>30</td>
            <td>London</td>
        </tr>
        <tr>
            <td>Jake</td>
            <td>28</td>
            <td>New York</td>
        </tr>
    </tbody>
</table>

名称
年龄
城市
约翰
30
伦敦
满意的
28
纽约
或在另一种情况下:

<table>
    <tbody>
        <tr>
            <th>Name</th>
            <th>Age</th>
            <th>City</th>
        </tr>
        <tr>
            <td>John</td>
            <td>30</td>
            <td></td>
        </tr>
        <tr>
            <td>Jake</td>
            <td>28</td>
            <td></td>
        </tr>
    </tbody>
</table>

名称
年龄
城市
约翰
30
满意的
28
我知道
中可以有哪些标签。
但是我不知道如何在xslt中做到这一点。

当您使用XSLT2.0时,您可以使用
xsl:for each group
构造来实现这一点,因此您可以从
name
元素开始对元素进行分组

试试这个XSLT。这假定
name
始终存在,并且是组中的第一个元素<代码>年龄和城市不需要出现

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
  <xsl:output method="html" indent="yes" html-version="5"/>

  <xsl:template match="persons">
    <table>
      <tr>
        <th>Name</th>
        <th>Age</th>
        <th>City</th>
      </tr>
      <xsl:for-each-group select="*" group-starting-with="name">
        <tr>
          <td><xsl:value-of select="." /></td>
          <td><xsl:value-of select="current-group()[self::age]" /></td>
          <td><xsl:value-of select="current-group()[self::city]" /></td>
        </tr>
      </xsl:for-each-group>
    </table>
  </xsl:template>
</xsl:stylesheet>

名称
年龄
城市

您知道可以使用哪个版本的XSLT吗?我使用的是版本2。0@Filburt是的,这很奇怪,但我不能改变它,所以我必须找到解决办法。。。如果有一个元素,
name
标签是否会始终为每个人提供?@TimC是的,它将始终提供谢谢!如何为每个标记应用模板?我试图用
xsl:apply templates
替换
xsl:value of
,但它只适用于
select=“”。
您需要澄清问题所在。请参阅使用
xsl:apply-templates
的示例,这正是我所怀疑的。但是在我的模板中,它应用了两次
age
city
模板。因此有
30年28年
伦敦纽约
。你知道为什么吗?代码应该完全相同,只是标记名不同。如果看不到代码,就不可能回答。我想你可能想问一个新问题。感谢名称空间的前缀似乎是问题所在。我试着把它修好。如果我找不到解决办法,我会问另一个问题。非常感谢你!