2014-03-30 140 views
1

所以,我有我从具有这种基本结构,政府下载了一些XML数据:转换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属性和遗漏码属性。但更大的问题是我只能得到一个轴标签而不是三个。我感觉我要么在错误的标签级别上工作,要么我错过了每一个。

任何帮助/链接到有用的教程表示赞赏。

回答

0

首先,因为您想为每个子节点label节点输出一个axis节点输出,所以需要迭代后者。从那里你可以参考父母的信息,生活在该级别。

此外,符合apply-templates,这通常是优于在for-each之上的XSLT。

<!-- 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

可运行演示(见输出

+0

这是很好的。有没有办法做到这一点,而不必指定轴和标签的属性,但动态地完成它(如果格式改变)? – JoeNahmias