我有一个带有列表结构的传入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>这不起作用,因为我在代码中以>和<结尾,而不是XML可解析的<或>。我希望这是一个非常简单的解决方案,但我在互联网上找不到任何记录。我忽略的简单解决方案是什么?
发布于 2011-01-17 06:56:48
这里是一个完整而简短的解决方案,它使用了 XSLT instruction
<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 ()指定name属性,如果 elementOne和elementTwo的字符串值不符合元素名称(QName)的词汇/语法规则,则可能引发错误。发布于 2011-01-17 06:42:00
我相信你可以用大括号代替<xsl:value-of>
<xsl:element name="{name}">
<xsl:value-of select="value"/>
</xsl:element>发布于 2011-01-17 06:43:32
我没试过,但这应该行得通。
<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>https://stackoverflow.com/questions/4708551
复制相似问题