XSLT转换:通过XML循环获取节点和值

时间:2013-04-30 02:57:51

标签: xml xslt

我有一个输入XML,我想使用XSLT将其转换为其他XML。

输入XML:

  <XML>
        <Fields>
                    <F1> Val1 </F1>
                    <F2> Val2 </F2>
                    <F1> Val3 </F1>
                    <F4> Val4 </F4>
        </Fields>
        </XML>

输出XML:

<SomeThing>

    <SomeThing>
                <Field id = "F1"> <val> Val1 </val> </Field>
                <Field id = "F2"> <val> Val2 </val> </Field>
                <Field id = "F3"> <val> Val3 </val> </Field>
                <Field id = "F4"> <val> Val4 </val> </Field>
  </SomeThing>
    </SomeThing>

我的XSLT :(我知道错了:()

 <xsl:for-each select="XML/Fields">
                    <field>
                        <xsl:attribute name="id">
                            <xsl:value-of select="." />
                            <value> 
                                <xsl:value-of select="current()"/> 
                            </value>
                        </xsl:attribute>
                    </field>
                </xsl:for-each>

XSLT很难。

1 个答案:

答案 0 :(得分:2)

这是一个更具扩展性的答案(因为它使用模板),不使用<xsl:for-each>,并且不需要<xsl:attribute>

当这个XSLT:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output omit-xml-declaration="yes" indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="/*">
    <SomeThings>
      <xsl:apply-templates/>
    </SomeThings>
  </xsl:template>

  <xsl:template match="Fields">
    <SomeThing>
      <xsl:apply-templates/>
    </SomeThing>
  </xsl:template>

  <xsl:template match="Fields/*">
    <Field id="{name()}">
      <val>
        <xsl:apply-templates/>
      </val>
    </Field>
  </xsl:template>
</xsl:stylesheet>

...适用于提供的XML:

<XML>
  <Fields>
    <F1> Val1 </F1>
    <F2> Val2 </F2>
    <F1> Val3 </F1>
    <F4> Val4 </F4>
  </Fields>
</XML>

...生成所需的输出:

<SomeThings>
  <SomeThing>
    <Field id="F1">
      <val> Val1 </val>
    </Field>
    <Field id="F2">
      <val> Val2 </val>
    </Field>
    <Field id="F1">
      <val> Val3 </val>
    </Field>
    <Field id="F4">
      <val> Val4 </val>
    </Field>
  </SomeThing>
</SomeThings>