2012-01-03 136 views
2

我需要將xml數據轉換爲其他格式。我做了很少XSL的東西,我的互聯網搜索沒有給我需要的結果。我有這個樣本XML:使用XSL將XML轉換爲XML

<MailStatusReport> 
     <Output> 
      <ColMetaData ColCount="5"> 
       <ColList> 
        <Col Name="parcelid" Pos="1"/> 
        <Col Name="currentlocationid" Pos="2"/> 
        <Col Name="deliverystatus" Pos="4"/> 
        <Col Name="requestedlocationid" Pos="3"/> 
        <Col Name="requestor" Pos="5"/> 
       </ColList> 
      </ColMetaData> 
      <RowList> 
       <Row> 
        <ColList> 
         <Col Pos="2">Delaware</Col> 
         <Col Pos="1">001</Col> 
         <Col Pos="3">NewYork</Col> 
         <Col Pos="4">InRoute</Col> 
         <Col Pos="5">John</Col> 

        </ColList> 
       </Row> 
       <Row> 
        <ColList> 
         <Col Pos="1">002</Col> 
         <Col Pos="2">Sanjose</Col> 
         <Col Pos="3">Michigan</Col> 
         <Col Pos="4">Delivered</Col> 
         <Col Pos="5">Rob</Col> 
        </ColList> 
       </Row> 
      </RowList> 
     </Output> 
</MailStatusReport> 

所需的輸出:

<MailStatusReport> 
     <Row parcelid="001" currentlocationid="Delaware" requestedlocationid="NewYork" deliverystatus="InRoute" requestor="John"/> 
     <Row parcelid="002" currentlocationid="Sanjose" requestedlocationid="Michigan" deliverystatus="Delivered" requestor="Rob"/> 
    </MailStatusReport> 

幾點需要注意:

  1. ColMetaData/ColList /列的輸入XML的名稱屬性最終成爲輸出xml的每個Row元素的屬性名稱。
  2. RowList/Row/ColList/Col在輸入xml中的值最終成爲輸出xml中屬性的值,該屬性與ColMetaData/ColList/Col部分中的Pos具有相同的Pos。
  3. ColMetaData的ColCount屬性值得信任,如果需要可以用作計數器。

的僞代碼,我能想到的是:

For each CurrentRow in the RowList 
    Begin Building OutputRow 
    For each Col in ColMetaData/ColList 
     attrName = ColMetaData/ColList/Col/Name 
     attrPos = ColMetaData/ColList/Col/Pos 
     attrVal = CurrentRow/ColList/Col[@Pos=$attrPos] 
     Add $attrName=$attrVal to the outputRow 

我希望得到任何幫助,我能搞定! 感謝 SRINIVAS

回答

3

這種轉變

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

<xsl:key name="kColNameByPos" match="Col/@Name" 
    use="../@Pos"/> 

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

<xsl:template match="Row"> 
    <Row> 
    <xsl:apply-templates select="*/*"> 
     <xsl:sort select="@Pos" data-type="number"/> 
    </xsl:apply-templates> 
    </Row> 
</xsl:template> 

<xsl:template match="Row/ColList/Col"> 
    <xsl:attribute name="{key('kColNameByPos', @Pos)}"> 
    <xsl:value-of select="."/> 
    </xsl:attribute> 
</xsl:template> 
</xsl:stylesheet> 

時所提供的XML文檔應用:

<MailStatusReport> 
    <Output> 
     <ColMetaData ColCount="5"> 
      <ColList> 
       <Col Name="parcelid" Pos="1"/> 
       <Col Name="currentlocationid" Pos="2"/> 
       <Col Name="deliverystatus" Pos="4"/> 
       <Col Name="requestedlocationid" Pos="3"/> 
       <Col Name="requestor" Pos="5"/> 
      </ColList> 
     </ColMetaData> 
     <RowList> 
      <Row> 
       <ColList> 
        <Col Pos="2">Delaware</Col> 
        <Col Pos="1">001</Col> 
        <Col Pos="3">NewYork</Col> 
        <Col Pos="4">InRoute</Col> 
        <Col Pos="5">John</Col> 
       </ColList> 
      </Row> 
      <Row> 
       <ColList> 
        <Col Pos="1">002</Col> 
        <Col Pos="2">Sanjose</Col> 
        <Col Pos="3">Michigan</Col> 
        <Col Pos="4">Delivered</Col> 
        <Col Pos="5">Rob</Col> 
       </ColList> 
      </Row> 
     </RowList> 
    </Output> 
</MailStatusReport> 

產生想要的,正確的結果

<MailStatusReport> 
    <Row parcelid="001" 
     currentlocationid="Delaware" 
     requestedlocationid="NewYork" 
     deliverystatus="InRoute" 
     requestor="John"/> 
    <Row parcelid="002" 
     currentlocationid="Sanjose" 
     requestedlocationid="Michigan" 
     deliverystatus="Delivered" 
     requestor="Rob"/> 
</MailStatusReport> 

說明

  1. 使用<xsl:sort>訂購的屬性生成的結果。

  2. 使用<xsl:key>key()函數來定義列名和列的位置之間的映射 - 更方便計算正在生成的屬性的名稱。

  3. 使用AVT(屬性值模板)生成計算值的屬性名稱。

+0

非常感謝你Dimitre這按預期工作。 – 2012-01-03 17:13:42

+0

@SrinivasPalakala:不客氣。 – 2012-01-03 17:23:16