将带有属性的xml元素转换为所有属性

时间:2014-03-30 21:37:26

标签: xml xslt

所以,我从政府那里下载了一些具有这种基本结构的XML数据:

<axis pos="6" values="3">
  <title>Device</title>
  <label code="7">Autologous Tissue Substitute</label>
  <label code="J">Synthetic Substitute</label>
  <label code="K">Nonautologous Tissue Substitute</label>
</axis>

我想使用XSLT获取看起来像这样的输出(我将加载到关系数据库表中):

<axis pos="6" title="Device" code="7" label="Autologous Tissue Substitute" />
<axis pos="6" title="Device" code="J" label="Synthetic Substitute" />
<axis pos="6" title="Device" code="K" label="Nonautologous Tissue Substitute" />

我真的不太了解XSLT(即我刚刚在网上阅读了一些教程大约一个小时),所以我想出的是:

<xsl:template match="axis">
    <axis pos="{pos}">
      <xsl:for-each select="*">
        <xsl:attribute name="{name()}">
          <xsl:value-of select="text()" />
        </xsl:attribute>
      </xsl:for-each>
    </axis>
</xsl:template>

这导致:

<axis pos="" title="Device" label="Nonautologous Tissue Substitute"/>

第一个问题是pos属性的空值和缺少的代码属性。但更大的问题是我只得到一个轴标签而不是三个。我觉得我要么在错误的标签级别上工作,要么我错过了一个for-each。

感谢任何有用教程的帮助/链接。

1 个答案:

答案 0 :(得分:0)

首先,既然你想为每个子axis节点输出一个label节点,那么你需要迭代后者。从那里,您可以参考回到父级,获取该级别的信息。

此外,符合apply-templates,这在XSLT中通常优先于for-each

<!-- kick things off -->
<xsl:template match="axis">
    <xsl:apply-templates select='label' />
</xsl:template>

<!-- do axis node, one per label child in source XML -->
<xsl:template match='label'>
    <axis pos='{../@pos}' title='{../title}' code='{@code}' label='{.}' />
</xsl:template>

请注意,您的pos属性为空,因为属性是通过前缀@引用的;省略它告诉XSLT处理器寻找子节点,而不是属性。

this XMLPlayground的可运行演示(请参阅输出来源