从另一个节点创建名称的节点

时间:2014-03-30 22:59:13

标签: xml xslt

我对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>

我想将其转换为:

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

我已尝试过以下XSLT,但它只是向我发出错误:

<xsl:template match="axis">
  <stuff>
    <xsl:apply-templates select="label" />
  </stuff>
</xsl:template>
<xsl:template match="label">
  <xsl:element name="{../title}">
    <xsl:value-of select="text()" />
  </xsl:element>
  <xsl:attribute name="pos">
    <xsl:value-of select="../@pos" />
  </xsl:attribute>
  <xsl:attribute name="code">
    <xsl:value-of select="@code" />
  </xsl:attribute>
</xsl:template>

3 个答案:

答案 0 :(得分:1)

我愿意:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="axis">
  <stuff>
    <xsl:apply-templates select="label" />
  </stuff>
</xsl:template>

<xsl:template match="label">
  <xsl:element name="{../title}">
    <xsl:copy-of select="@code | ../@pos" />
    <xsl:value-of select="." />
  </xsl:element>
</xsl:template>

</xsl:stylesheet>

答案 1 :(得分:0)

怎么样:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:template match="/">
    <root>
        <xsl:for-each select="axis/label">
            <xsl:element name="{../title}">
                <xsl:attribute name="pos">
                    <xsl:value-of select="../@pos" />
                </xsl:attribute>
                <xsl:attribute name="code">
                    <xsl:value-of select="@code" />
                </xsl:attribute>
                <xsl:value-of select="." />
            </xsl:element>
        </xsl:for-each>
    </root>
</xsl:template>

</xsl:stylesheet>

答案 2 :(得分:0)

这似乎有效:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes" />
<xsl:template match="/root">
  <xsl:apply-templates select="axis" />
</xsl:template>
<xsl:template match="axis">
  <stuff>
    <xsl:apply-templates select="label" />
  </stuff>
</xsl:template>
<xsl:template match="label">
  <xsl:element name="{../title}">
    <xsl:attribute name="pos">
      <xsl:value-of select="../@pos" />
    </xsl:attribute>
    <xsl:attribute name="code">
      <xsl:value-of select="@code" />
    </xsl:attribute>
    <xsl:value-of select="." />
  </xsl:element>
</xsl:template>
</xsl:stylesheet>