在XSLT中将XML元素包装到组中

时间:2013-11-05 17:44:34

标签: xml xslt xslt-1.0

我正在尝试编写一些修改服务输出的XSLT,并将其分组为逻辑结构以供使用。但是,我对如何做到这一点感到茫然。

以下是该服务的输出。唯一可以确定的是,尽管每个省略号中都有子节点,但这些项目都是这样返回的。

输出

<items>
  <text>...</text>
  <text>...</text>
  <text>...</text>
  <text>...</text>
  <comment>...</comment>
  <comment>...</comment>
  <comment>...</comment>
  <comment>...</comment>
  <discussion>...</discussion>
  <discussion>...</discussion>
  <discussion>...</discussion>
  <discussion>...</discussion>
  <information>...</information>
  <information>...</information>
  <information>...</information>
  <information>...</information>
</items>

所需

<items>
  <item>
    <text>...</text>
    <comment>...</comment>
    <discussion>...</discussion>
    <information>...</information>
  </item>
  <item>
    <text>...</text>
    <comment>...</comment>
    <discussion>...</discussion>
    <information>...</information>
  </item>
  <item>
    <text>...</text>
    <comment>...</comment>
    <discussion>...</discussion>
    <information>...</information>
  </item>
  <item>
    <text>...</text>
    <comment>...</comment>
    <discussion>...</discussion>
    <information>...</information>
  </item>
</items>

我很确定这在XSLT(1.0)中是可能的,而this question可能与我想要做的尽可能接近,尽管这个问题仅基于一个元素,而我有多个节点。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:3)

使用

<xsl:template match="items">
  <xsl:copy>
    <xsl:apply-templates select="text"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="text">
  <xsl:variable name="pos" select="position()"/>
  <item>
    <xsl:copy-of select=". | ../comment[$pos] | ../discussion[$pos] | ../information[$pos]"/>
  </item>
</xsl:template>

创建结构,只需要

<xsl:output indent="yes"/>

看起来不错。