2014-01-27 56 views
0

假設下面的xml輸入。動態元素的XML轉換

<Report Name="Report2" > 
<ITable i_id="Item ID" i_name="Item Name" heart_beat="Heart Beat" is_active="Is Active"> 
     <FkItemID_Collection> 
      <FkItemID i_id="1"> 
       <i_name i_name="80"> 
        <heart_beat heart_beat="0"> 
          <is_active is_active="True"> 
           <Tags> 
            <Tag Name="ItemClass" Value="Division"/> 
            <Tag Name="ItemDisplayName" Value="80"/> 
            <Tag Name="ItemName" Value="80"/> 
            <Tag Name="ItemType" Value="Logical"/> 
           </Tags> 
          </is_active> 
        </heart_beat> 
       </i_name> 
      </FkItemID> 
      <FkItemID i_id="2"> 
      //Same formatted day as above element 
      </FkItemID> 
     </FkItemID_Collection> 
</ITable> 
</Report> 

專業有關XML是可以有很多元素,比如, 例如:

<i_name i_name="80"> 
      <i_price i_price ="10"> 
       <heart_beat heart_beat="0">` 

同樣。

這些元素的數量可以動態改變。這些標籤通常位於<Tags>區塊內。

至於最終的結果,我希望輸出這樣

<Report Name="Report2"> 
<Table i_id="Item ID" i_name="item Name" heart_beat="heart_beat" col1="ItemClass" col2="ItemDisplayName" col3="ItemName" col4="ItemType" > 
    <Details agent_id="1" agent_name="80" col1="Division" col2="80" col3="80" col4="Logical" /> 
    <Details i_id="2" i_name="BC" col1="Division" col2="BC" col3="BC" col4="Logical" /> 
</Table> 
</Report> 

我寫的場景中XSLT。但我有一些問題,我無法解決。這是我迄今爲止所開發的。我被困在那些我不知道如何深入內部元素的部分,直到找到Tags塊和如何迎合上面提到的item_price等動態生成的標籤爲止。

這就是我現在所做的。

<xsl:template match="/*/*[local-name()='ITable']"> 
    <xsl:element name="Table"> 
     <xsl:for-each select="./*"> 
      <xsl:for-each select="./*"> 
       <xsl:if test="position()=1"> 
        <xsl:attribute name="i_id">Item ID</xsl:attribute> 
        <xsl:attribute name="i_name">Item Name</xsl:attribute> 
        <xsl:attribute name="i_beat">heart_beat</xsl:attribute> 
        <xsl:for-each select="./*/*/*/*"> 
         <xsl:attribute name="{concat('col', position())}"> 
          <xsl:value-of select="@TagName"/> 
         </xsl:attribute> 
        </xsl:for-each> 
       </xsl:if> 
      </xsl:for-each> 

      <xsl:for-each select="./*"> 
       <xsl:element name="Details"> 
        <xsl:attribute name="i_id"> 
         <xsl:value-of select="@i_id"/> 
        </xsl:attribute> 
        <xsl:for-each select="./*"> 
         <xsl:attribute name="i_name"> 
          <xsl:value-of select="@i_name"/> 
         </xsl:attribute> 
         <xsl:for-each select="./*/*/*"> 
          <xsl:attribute name="{concat('col', position())}"> 
           <xsl:value-of select="@TagValue"/> 
          </xsl:attribute> 
         </xsl:for-each> 
        </xsl:for-each> 
       </xsl:element> 
      </xsl:for-each> 
     </xsl:for-each> 
    </xsl:element> 
</xsl:template> 

什麼是這個問題的最佳解決方案。

+1

不要使用XSLT 1.0和2.0標記您的帖子。說出你正在使用的版本 - 這是這些標籤的用途。 –

+0

對不起,XSLT 1.0 –

回答

0

標籤總是進入塊內。 ... 我堅持,我不知道我是如何深入得進去元素,直到我找到 標籤阻止

這部分 是什麼後代軸是:descendant::Tags//Tags將「發現「標籤阻止你,不管它有多深。