所以,我从政府那里下载了一些具有这种基本结构的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。
感谢任何有用教程的帮助/链接。
答案 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的可运行演示(请参阅输出来源)