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