0

我有一个输入 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 很难。

4

1 回答 1

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>
于 2013-04-30T04:30:49.560 回答