使用xslt使用属性值替换XML元素标记

使用xslt使用属性值替换XML元素标记,xml,xslt,ssis,Xml,Xslt,Ssis,如何使用样式表将XML元素标记名替换为属性值?XML文件结构相当简单,我想使用元素的属性值替换元素标记名(DataColumn)。我在SSIS工作。XML文件是数据源。我知道解析XML文件的方法可能不止一种,但我正在SSIS中寻找XML转换方法。我能想到的另一个解决方案是枢轴组件。但是,如果XML文件包含30个或更多元素,那么它就变得非常简单。下面是XML结构。我把内容缩短了,这样就不会太长了 <?xml version="1.0" encoding="utf-8"?> <Ro

如何使用样式表将XML元素标记名替换为属性值?XML文件结构相当简单,我想使用元素的属性值替换元素标记名(DataColumn)。我在SSIS工作。XML文件是数据源。我知道解析XML文件的方法可能不止一种,但我正在SSIS中寻找XML转换方法。我能想到的另一个解决方案是枢轴组件。但是,如果XML文件包含30个或更多元素,那么它就变得非常简单。下面是XML结构。我把内容缩短了,这样就不会太长了

<?xml version="1.0" encoding="utf-8"?>
<RootNode>
  <ResponseHeader />
  <CustomReport Name="Sample Test" ID="000">
    <DataRow>
      <DataColumn Name="Order ID">12345654</DataColumn>
      <DataColumn Name="Company ID">656584</DataColumn>
      <DataColumn Name="First Name">John</DataColumn>
      <DataColumn Name="Last Name">Smith</DataColumn>
      <DataColumn Name="Email">john.smith@domain.com</DataColumn>
      <DataColumn Name="Address 1">13542 S Main Street</DataColumn>
      <DataColumn Name="Address 2"></DataColumn>
      <DataColumn Name="City">Dallas</DataColumn>
      <DataColumn Name="State">TX</DataColumn>
      <DataColumn Name="Zip">75236</DataColumn>
      <DataColumn Name="Country">United States</DataColumn>
      <DataColumn Name="Phone">000-000-0000</DataColumn>
      <DataColumn Name="Fax"></DataColumn>
    </DataRow>
    <DataRow>
      <DataColumn Name="Order ID">5432354</DataColumn>
      <DataColumn Name="Company ID">545454</DataColumn>
      <DataColumn Name="First Name">Jane</DataColumn>
      <DataColumn Name="Last Name">Smith</DataColumn>
      <DataColumn Name="Email">jane.smith@domain.com</DataColumn>
      <DataColumn Name="Address 1">213213 W Main Blvd.</DataColumn>
      <DataColumn Name="Address 2"></DataColumn>
      <DataColumn Name="City">Baltimore</DataColumn>
      <DataColumn Name="State">MD</DataColumn>
      <DataColumn Name="Zip">21207</DataColumn>
      <DataColumn Name="Country">United States</DataColumn>
      <DataColumn Name="Phone">000-000-0000</DataColumn>
      <DataColumn Name="Fax"></DataColumn>
    </DataRow>
  </CustomReport>
</RootNode>

12345654
656584
约翰
史密斯
厕所。smith@domain.com
主街13542号
达拉斯
德克萨斯州
75236
美国
000-000-0000
5432354
545454
简
史密斯
简。smith@domain.com
西大街213号。
巴尔的摩
医学博士
21207
美国
000-000-0000
以下是所需的输出:

<?xml version="1.0" encoding="utf-8"?>
    <RootNode>
      <ResponseHeader />
      <CustomReport Name="Sample Test" ID="000">
        <DataRow>
          <Order ID>12345654</Order ID>
          <Company ID>656584</Company ID>
          <First Name>John</First Name>
          <Last Name>Smith</Last NAme>
          <Email>john.smith@domain.com</Email>
          <Address 1>13542 S Main Street</Address 1>
          <Address 2></Address2>
          <City>Dallas</City>
          <State>TX</State>
          <Zip>75236</Zip>
          <Country>United States</Country>
          <Phone>000-000-0000</Phone>
          <Fax></Fax>
        </DataRow>
        <DataRow>
          <Order ID>5432354</Order ID>
          <Company ID>545454</Company ID>
          <First Name>Jane</First Name>
          <Last Name>Smith</Last Name>
          <Email>jane.smith@domain.com</Email>
          <Address 1>213213 W Main Blvd.</Address 1>
          <Address 2></Address 2>
          <City>Baltimore</City>
          <State>MD</State>
          <Zip>21207</Zip>
          <Country>United States</Country>
          <Phone>000-000-0000</Phone>
          <Fax></Fax>
        </DataRow>
      </CustomReport>
    </RootNode>

12345654
656584
约翰
史密斯
厕所。smith@domain.com
主街13542号
达拉斯
德克萨斯州
75236
美国
000-000-0000
5432354
545454
简
史密斯
简。smith@domain.com
西大街213号。
巴尔的摩
医学博士
21207
美国
000-000-0000

如果这个主题以前已经发布并回答过,请给我指出正确的链接。谢谢大家!

根据我上面的评论,您可以尝试:

XSLT1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="DataColumn">
    <xsl:element name="{translate(@Name, ' ', '_')}">
        <xsl:value-of select="." />
    </xsl:element>
</xsl:template>

</xsl:stylesheet>

应用于给定的输入示例,结果将是:

<?xml version="1.0" encoding="UTF-8"?>
<RootNode>
   <ResponseHeader/>
   <CustomReport Name="Sample Test" ID="000">
      <DataRow>
         <Order_ID>12345654</Order_ID>
         <Company_ID>656584</Company_ID>
         <First_Name>John</First_Name>
         <Last_Name>Smith</Last_Name>
         <Email>john.smith@domain.com</Email>
         <Address_1>13542 S Main Street</Address_1>
         <Address_2/>
         <City>Dallas</City>
         <State>TX</State>
         <Zip>75236</Zip>
         <Country>United States</Country>
         <Phone>000-000-0000</Phone>
         <Fax/>
      </DataRow>
      <DataRow>
         <Order_ID>5432354</Order_ID>
         <Company_ID>545454</Company_ID>
         <First_Name>Jane</First_Name>
         <Last_Name>Smith</Last_Name>
         <Email>jane.smith@domain.com</Email>
         <Address_1>213213 W Main Blvd.</Address_1>
         <Address_2/>
         <City>Baltimore</City>
         <State>MD</State>
         <Zip>21207</Zip>
         <Country>United States</Country>
         <Phone>000-000-0000</Phone>
         <Fax/>
      </DataRow>
   </CustomReport>
</RootNode>

12345654
656584
约翰
史密斯
厕所。smith@domain.com
主街13542号
达拉斯
德克萨斯州
75236
美国
000-000-0000
5432354
545454
简
史密斯
简。smith@domain.com
西大街213号。
巴尔的摩
医学博士
21207
美国
000-000-0000

但是,如果名称以数字开头,这也会失败,例如。

您不能完全做到这一点,因为某些名称属性包含空格,而这些属性不允许作为元素名称。 不能有元素
Smith
但是,可以使用其他字符替换空格,如- 这应该做到:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  >

  <xsl:template match="RootNode|CustomReport|DataRow">
   <xsl:element name="{name()}">
    <xsl:apply-templates select="@*"/>
    <xsl:apply-templates/>
   </xsl:element>
  </xsl:template>

  <xsl:template match="DataColumn">
   <xsl:variable name='nn' select="translate(@Name,' ','-')"/>
   <xsl:element name="{$nn}">
    <xsl:apply-templates select="*"/>
    <xsl:apply-templates/>
   </xsl:element>
  </xsl:template>

<xsl:template match="@*">
   <xsl:attribute name="{name()}">
    <xsl:value-of select="."/>
   </xsl:attribute>
  </xsl:template>

  <xsl:template match="text()">
    <xsl:value-of select='.'/>
  </xsl:template>


</xsl:stylesheet>

其中:

<?xml version="1.0"?>
<RootNode>

  <CustomReport Name="Sample Test" ID="000">
    <DataRow>
      <Order-ID>12345654</Order-ID>
      <Company-ID>656584</Company-ID>
      <First-Name>John</First-Name>
      <Last-Name>Smith</Last-Name>
      <Email>john.smith@domain.com</Email>
      <Address-1>13542 S Main Street</Address-1>
      <Address-2/>
      <City>Dallas</City>
      <State>TX</State>
      <Zip>75236</Zip>
      <Country>United States</Country>
      <Phone>000-000-0000</Phone>
      <Fax/>
    </DataRow>
    <DataRow>
      <Order-ID>5432354</Order-ID>
      <Company-ID>545454</Company-ID>
      <First-Name>Jane</First-Name>
      <Last-Name>Smith</Last-Name>
      <Email>jane.smith@domain.com</Email>
      <Address-1>213213 W Main Blvd.</Address-1>
      <Address-2/>
      <City>Baltimore</City>
      <State>MD</State>
      <Zip>21207</Zip>
      <Country>United States</Country>
      <Phone>000-000-0000</Phone>
      <Fax/>
    </DataRow>
  </CustomReport>
</RootNode>

12345654
656584
约翰
史密斯
厕所。smith@domain.com
主街13542号
达拉斯
德克萨斯州
75236
美国
000-000-0000
5432354
545454
简
史密斯
简。smith@domain.com
西大街213号。
巴尔的摩
医学博士
21207
美国
000-000-0000

您所要求的是不可能的,因为@Name值不是有效的XML元素名称(它们包含空格),所以您显示的“所需输出”不是格式良好的XML文档。你可以用下划线代替空格来解决这个问题,但是可能会有其他字符让你绊倒。谢谢!它确实奏效了。但有一个问题,如果根节点有名称空间,是否会应用相同的样式表?这取决于。如果
RootNode
元素声明了一个默认名称空间(该名称空间将由
DataColumn
继承),那么no-这将无法正常工作。