我有一个带有列表结构的传入XML文件:
<list>
<listItem>
<name>elementOne</name>
<value>elementOneValue</name>
</listItem>
<listItem>
<name>elementTwo</name>
<value>elementTwoValue</name>
</listItem>
</list>
我正在尝试转换为此结构:
<elementOne>elementOneValue</elementOne>
<elementTwo>elementTwoValue</elementTwo>
这是使用XSL实现的简单逻辑,但我遇到了并发症。
<xsl:for-each select="/list/listItem">
<xsl:element name="<xsl:value-of select="name"/>">
<xsl:value-of select="value"/>
</xsl:element>
</xsl:for-each>
不起作用,因为我假设顺序双引号打破<xsl:element>
标记
<xsl:for-each select="/list/listItem">
<<xsl:value-of select="name"/>>
<xsl:value-of select="value"/>
</<xsl:value-of select="name"/>>
</xsl:for-each>
不起作用,因为我无法使用<<
或>>
和
<xsl:for-each select="/list/listItem">
<<xsl:value-of select="name"/>>
<xsl:value-of select="value"/>
</<xsl:value-of select="name"/>>
</xsl:for-each>
不起作用,因为我最终得到了&gt;和&lt;在我的代码中,而不是XML可解析的<
或>
。我希望这是一个非常简单的解决方案,但我无法在互联网上找到它的任何记录。我忽视的简单修复是什么?
答案 0 :(得分:13)
这是一个完整而简短的解决方案,使用<xsl:element>
XSLT指令:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="listItem">
<xsl:element name="{name}">
<xsl:value-of select="value"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
将此转换应用于提供的XML文档(更正为格式良好):
<list>
<listItem>
<name>elementOne</name>
<value>elementOneValue</value>
</listItem>
<listItem>
<name>elementTwo</name>
<value>elementTwoValue</value>
</listItem>
</list>
生成了想要的结果:
<elementOne>elementOneValue</elementOne>
<elementTwo>elementTwoValue</elementTwo>
请注意:
使用<xsl:element>
指令创建具有静态未知名称的元素。
使用AVT (Attribute-Value-Template)以紧凑且更易读的方式指定name
属性。
如果elementOne
和elementTwo
的字符串值不符合元素名称的词法/句法规则,则可能会引发错误 (的QName)。
答案 1 :(得分:7)
我相信你可以使用大括号而不是<xsl:value-of>
:
<xsl:element name="{name}">
<xsl:value-of select="value"/>
</xsl:element>
答案 2 :(得分:0)
没试过,但这可行......
<xsl:for-each select="/list/listItem">
<xsl:variable name="elemName" select="name"/>
<xsl:element name="$elemName">
<xsl:value-of select="value"/>
</xsl:element>
</xsl:for-each>