2016-04-21 170 views
2

如何使用樣式表將屬性值替換爲XML元素標記名稱? XML文件結構非常簡單,我想用元素中的屬性值替換元素標籤名稱(DataColumn)。我正在與SSIS合作。 XML文件是數據源。我知道可能有多種解析XML文件的方法,但我正在尋找SSIS中的XML轉換方法。我能夠提出的替代解決方案是PIVOT組件。但是,如果XML文件包含30個或更多元素,則它變得非常微不足道。這裏是XML結構。我縮短了內容,以免它太長。使用xslt使用屬性值替換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">[email protected]</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">[email protected]</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> 

下面是所需的輸出:

<?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>[email protected]</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>[email protected]</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> 

如果這個問題已經公佈,前回答,請點我到正確的鏈接。謝謝!

+0

什麼你問的是不可能,因爲您的@Name值不是有效的XML元素名稱(它們包含空格) - 所以您所顯示的「所需輸出」不是格式良好的XML文檔。你可以通過用(例如)下劃線替換空格來解決這個問題 - 但是在那裏可能會有其他角色會讓你感到不安。 –

回答

2

符合我上面的評論,你可以嘗試:

XSLT 1.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>[email protected]</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>[email protected]</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> 

然而,例如,如果名稱以數字開頭,這也會失敗。

+0

謝謝!它確實有效。但是有一個問題,如果根節點具有名稱空間,是否會應用相同的樣式表? –

+0

這取決於。如果'RootNode'元素聲明一個**默認命名空間**(它將被'DataColumn'繼承),那麼不會 - 這不會按原樣工作。 –

0

你不能這樣做,因爲某些名稱屬性有空格,並且這些屬性不允許作爲元素名稱。 你不能有一個元素<Last Name>Smith</Last Name> 但是你可以像其他字符替換空間 - 這應做到:

<?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>[email protected]</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>[email protected]</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> 
+0

謝謝!有效。 –