【问题标题】:How can I transform an element attribute to an element name in XSLT?如何在 XSLT 中将元素属性转换为元素名称?
【发布时间】:2010-10-16 09:48:40
【问题描述】:

我将链接以转换 XML 与以下属性中的“名称”属性:

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

进入名称属性中的元素:

<books>
  <TheBumperBookOfXMLProgramming/>
  <XsltForDummies/>
</books>

使用 XSLT。有什么想法吗?

【问题讨论】:

  • 以下两个答案都是有效的。 @divo's 正是我所要求的,@Martin's 是另一个需要牢记的考虑因素。感谢两者:)
  • 为什么要这样做?这没有多大意义。
  • @Ambrose - 好奇?此外,为后者定义 XMLSchema 似乎更直接。
  • XML/HTML 等的重点是标记应该定义内容。不是内容。你的想法和里面有书名的纯文本文件有什么区别?
  • @Ambrose - 提供的示例删除了与问题无关的任何内容。实际上会有内容,我想在“以元素为中心”和“以属性为中心”的 XML 之间进行转换(如stackoverflow.com/questions/241819/…

标签: xml xslt transform xml-attribute


【解决方案1】:
<xsl:template match="book">
   <xsl:element name="{@name}">
       <xsl:copy-of select="@*[name()!='name'] />
   </xsl:element>
</xsl:template>

这也会复制&lt;book&gt; 上未命名为“名称”的任何属性

<book name="XsltForDummies" id="12" />

会变成

<XsltForDummies id="12 />

【讨论】:

    【解决方案2】:

    您可以使用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:如何限制更多?据我所知,这两个都是production rule的名字
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-18
    • 1970-01-01
    • 1970-01-01
    • 2018-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多