xsl:value-of用作xsl:元素名称

Tho*_*mer 7 xml xslt templates value-of

我有一个带有列表结构的传入XML文件:

<list>
  <listItem>
    <name>elementOne</name>
    <value>elementOneValue</name>
  </listItem>
  <listItem>
    <name>elementTwo</name>
    <value>elementTwoValue</name>
  </listItem>
</list>
Run Code Online (Sandbox Code Playgroud)

我试图转换为这个结构:

<elementOne>elementOneValue</elementOne>
<elementTwo>elementTwoValue</elementTwo>
Run Code Online (Sandbox Code Playgroud)

这是使用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>
Run Code Online (Sandbox Code Playgroud)

不起作用,因为我假设顺序双引号打破了<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>
Run Code Online (Sandbox Code Playgroud)

不起作用,因为我不能使用<<>>

<xsl:for-each select="/list/listItem">
  &lt;<xsl:value-of select="name"/>&gt;
    <xsl:value-of select="value"/>
  &lt;/<xsl:value-of select="name"/>&gt;
</xsl:for-each>
Run Code Online (Sandbox Code Playgroud)

不起作用,因为我最终使用>和<在我的代码而不是XML可解析<>.我希望这是一个非常简单的解决方案,但我无法在互联网上找到它的任何记录.我忽视的简单修复是什么?

Dim*_*hev 14

这是一个完整而简短的解决方案,使用<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>
Run Code Online (Sandbox Code Playgroud)

当对提供的XML文档应用此转换时(已更正为格式正确):

<list>
    <listItem>
        <name>elementOne</name>
        <value>elementOneValue</value>
    </listItem>
    <listItem>
        <name>elementTwo</name>
        <value>elementTwoValue</value>
    </listItem>
</list>
Run Code Online (Sandbox Code Playgroud)

产生了想要的结果:

<elementOne>elementOneValue</elementOne>
<elementTwo>elementTwoValue</elementTwo>
Run Code Online (Sandbox Code Playgroud)

请注意:

  1. 使用该<xsl:element>指令创建具有静态未知名称的元素.

  2. 使用AVT(属性 - 值 - 模板)以name紧凑且可读的方式指定属性.

  3. 如果字符串值为elementOneelementTwo不遵守元素名称(QName)的词法/语法规则,则可能会引发错误.


Mic*_*son 7

我相信你可以使用花括号而不是<xsl:value-of>:

<xsl:element name="{name}">
    <xsl:value-of select="value"/>
</xsl:element>
Run Code Online (Sandbox Code Playgroud)