XSLT:XML 第一个属性需要转换为具有第二个属性值的元素

Posted

技术标签:

【中文标题】XSLT:XML 第一个属性需要转换为具有第二个属性值的元素【英文标题】:XSLT: XML first attribute need to be transformed to element with value of second attribute 【发布时间】:2021-01-28 22:48:32 【问题描述】:

使用 xslt 1.0,我需要将输入 xml 转换为输出 xml(见下文)。 换句话说,每个具有“Field”和“Value”两个属性的“Data”元素都需要转换为名称为“Field”值和“Value”值的元素。

<?xml version="1.0" encoding="utf-8"?>
<DataFile>
<DataSet Name="DataSet1">
  <Data Field="Id" Value="111"/>
  <Data Field="Name" Value="John"/>
  <Data Field="ZIP" Value="10000"/>
  <Data Field="Phone" Value="0102030405"/>
</DataSet>
<DataSet Name="DataSet2">
  <Data Field="Id" Value="222"/>
  <Data Field="Name" Value="James"/>
  <Data Field="ZIP" Value="10020"/>
</DataSet>
<DataSet Name="DataSet3">
  <Data Field="Id" Value="333"/>
  <Data Field="Name" Value="Mike"/>
  <Data Field="Phone" Value="0607080910"/>
</DataSet>
</DataFile>

我需要文件:

<DataFile>
   <DataSet Name="DataSet1">
      <Id>111</Id>
      <Name>John</Name>
      <ZIP>10000</ZIP>
      <Phone>0102030405</Phone>
   </DataSet>
   <DataSet Name="DataSet2">
      <Id>222</Id>
      <Name>James</Name>
      <ZIP>10020</ZIP>
   </DataSet>
   <DataSet Name="DataSet3">
      <Id>333</Id>
      <Name>Mike</Name>
      <Phone>0607080910</Phone>
   </DataSet>
</DataFile>

我尝试使用类似示例中的 XSLT,但它不起作用(出现类似“无法使用提供的 XML/XSL 输入生成 XML 文档。无效的元素名称(空序列)”之类的错误。

XSLT:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()" />
    </xsl:copy>
  </xsl:template>
  <xsl:template match="Data">
      <xsl:element name="@name" >
      <xsl:value-of select="@Value"/>
    </xsl:element>
  </xsl:template>
</xsl:stylesheet>

请帮忙

【问题讨论】:

【参考方案1】:

你想要&lt;xsl:element name="@Field"&gt;而不是&lt;xsl:element name="@name"&gt;

【讨论】:

以上是关于XSLT:XML 第一个属性需要转换为具有第二个属性值的元素的主要内容,如果未能解决你的问题,请参考以下文章

XSLT 访问和创建嵌套 xml 并将标签转换为属性

Adobe LiveCycle:使用 XSLT 将 XML 转换为 XML

XSLT XML 到 HTML 的 2 阶段转换 - 必须是更好的方法

不能在“根”类型的节点中构造“属性”类型的项目

为啥 XSLT 默认输出所有文本?

使用 XSLT 将 XML 元素转换为 XML 属性