如何在XSLT中将元素属性转换为元素名称?

3

我希望能够转换带有像以下所示的'name'属性的XML属性:

<books>
  <book name="TheBumperBookOfXMLProgramming"/>
  <book name="XsltForDummies"/>
</books>

将其分解成所谓的元素,即名称属性中的内容:
<books>
  <TheBumperBookOfXMLProgramming/>
  <XsltForDummies/>
</books>

使用XSLT进行转换。有什么想法吗?

下面两个答案都是有效的。@divo的回答正是我所问的,@Martin的回答是需要考虑的额外因素。谢谢你们两个 :) - brabster
你为什么想要这样做呢?这没有太多意义。 - AmbroseChapel
@Ambrose - 好奇心吗?另外,似乎使用XMLSchema来定义后者更为直观。 - brabster
XML/HTML等的整个意义在于标记应该定义内容,而不是成为内容。 你的想法和一个纯文本文件有书名有什么区别? - AmbroseChapel
@Ambrose - 提供的示例已经删除了与问题无关的内容。实际上会有内容,我想在“元素为中心”和“属性为中心”的XML之间进行转换(如https://dev59.com/rHVC5IYBdhLWcg3wnCWA)。 - brabster
2个回答

4
您可以使用xsl:element按名称创建元素:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet 
     version="1.0" 
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="/">
    <books>
      <xsl:apply-templates />
    </books>

  </xsl:template>

  <xsl:template match="book">
    <xsl:element name="{@name}" />
  </xsl:template>

</xsl:stylesheet>

这意味着可以创建无效的 XML(即:非 XML),因为元素名称的字符集更加受限,但这种可能性仍然存在。 - pc1oad1etter
@pc1oad1etter:它怎么更受限制?据我所知,根据这个生产规则,两者都是名称。 - Dirk Vollmar

3
<xsl:template match="book">
   <xsl:element name="{@name}">
       <xsl:copy-of select="@*[name()!='name'] />
   </xsl:element>
</xsl:template>

这也会复制任何未命名为“name”的<book>上的属性。
<book name="XsltForDummies" id="12" />

将变成

<XsltForDummies id="12 />

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接