【问题标题】:xsl:value-of used as xsl:element namexsl:value-of 用作 xsl:元素名称
【发布时间】:2011-01-16 22:35:24
【问题描述】:

我有一个带有列表结构的传入 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>

不起作用,因为我假设连续的双引号破坏了&lt;xsl:element&gt; 标签

<xsl:for-each select="/list/listItem">
  <<xsl:value-of select="name"/>>
    <xsl:value-of select="value"/>
  </<xsl:value-of select="name"/>>
</xsl:for-each>

不起作用,因为我不能使用 &lt;&lt;&gt;&gt;

<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>

不起作用,因为我的代码中以 > 和 < 或 &gt; 结尾。我希望这是一个非常简单的解决方案,但我在互联网上找不到任何记录。我忽略的简单修复是什么?

【问题讨论】:

  • 好问题,+1。使用&lt;xsl:element&gt; 查看我的答案以获得完整而简短的解决方案。 :)

标签: xml templates xslt value-of


【解决方案1】:

这是一个完整而简短的解决方案,使用 &lt;xsl:element&gt; 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>

请注意

  1. 使用&lt;xsl:element&gt; 指令创建静态未知名称的元素。

  2. 使用 AVT (Attribute-Value-Template) 以简洁易读的方式指定 name 属性。

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

【讨论】:

    【解决方案2】:

    我相信你可以用花括号代替&lt;xsl:value-of&gt;

    <xsl:element name="{name}">
        <xsl:value-of select="value"/>
    </xsl:element>
    

    【讨论】:

    • 我在寻找别的东西,但这是我正在寻找的答案...谢谢!
    【解决方案3】:

    没有尝试过,但是这很有效......

       <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>
    

    【讨论】:

    • 关闭,但您需要转义变量
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-18
    • 2011-04-09
    • 1970-01-01
    相关资源
    最近更新 更多