XSLT转换:通过XML循环获取节点和值
我有一个输入XML,我想使用XSLT将其转换为其他XML 输入XML:XSLT转换:通过XML循环获取节点和值,xml,xslt,Xml,Xslt,我有一个输入XML,我想使用XSLT将其转换为其他XML 输入XML: <XML> <Fields> <F1> Val1 </F1> <F2> Val2 </F2> <F1> Val3 </F1> <F4> Va
<XML>
<Fields>
<F1> Val1 </F1>
<F2> Val2 </F2>
<F1> Val3 </F1>
<F4> Val4 </F4>
</Fields>
</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>
瓦尔1
瓦尔2
Val3
瓦尔4
输出XML:
<XML>
<Fields>
<F1> Val1 </F1>
<F2> Val2 </F2>
<F1> Val3 </F1>
<F4> Val4 </F4>
</Fields>
</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>
瓦尔1
瓦尔2
Val3
瓦尔4
我的XSLT:(我知道它错了:()
XSLT很难使用。这里有一个更具扩展性的答案(因为它使用模板),不使用
,也不需要
当此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>
<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>
…应用于提供的XML:
<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>
<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>
瓦尔1
瓦尔2
Val3
瓦尔4
…生成所需的输出:
<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>
<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>
瓦尔1
瓦尔2
Val3
瓦尔4
收到了,请再次检查