2009-12-31 288 views
1

我有以下XML,我想使用XSLT把它轉換成我的願望XML,我已經有點succeded但不是全部問題就解決了。所以 我需要幫助現有節點添加到另一個節點的子節點

給出的我輸入XML

<?xml version = '1.0'?> 
<ROWSET> 
<irp_account num="1"> 
<IRP_CARRIER_ID_NUMBER>274845</IRP_CARRIER_ID_NUMBER> 
<IRP_ACCOUNT_NUMBER>55002</IRP_ACCOUNT_NUMBER> 
</irp_account>  
<irp_account num="97"> 
<IRP_CARRIER_ID_NUMBER>957858</IRP_CARRIER_ID_NUMBER> 
<IRP_ACCOUNT_NUMBER>59940</IRP_ACCOUNT_NUMBER> 
<NAME_TYPE>LG</NAME_TYPE> 
<NAME>SONNY DAVIS INC</NAME> 
<ADDRESS_TYPE>MA</ADDRESS_TYPE> 
</irp_account> 
<irp_account num="98"> 
<IRP_CARRIER_ID_NUMBER>957858</IRP_CARRIER_ID_NUMBER> 
<IRP_ACCOUNT_NUMBER>59940</IRP_ACCOUNT_NUMBER> 
<NAME_TYPE>LG</NAME_TYPE> 
<NAME>SONNY DAVIS INC</NAME> 
<ADDRESS_TYPE>PH</ADDRESS_TYPE> 
</irp_account> 
</ROWSET> 

隨着使用XSLT我要生成輸出XML這樣的。

<?xml version="1.0"?> 
<T0020> 
<IRP_ACCOUNT> 
<IRP_CARRIER_ID_NUMBER>274845</IRP_CARRIER_ID_NUMBER> 
<IRP_ACCOUNT_NUMBER>55002</IRP_ACCOUNT_NUMBER> 
<IRP_NAME> 
<NAME_TYPE>LG</NAME_TYPE> 
<NAME>A P SUPPLY CO</NAME> 
<IRP_ADDRESS> 
<ADDRESS_TYPE>PH</ADDRESS_TYPE> 
</IRP_ADDRESS> 
<IRP_ADDRESS> 
<ADDRESS_TYPE>MA</ADDRESS_TYPE> 
</IRP_ADDRESS> 
</IRP_NAME> 
</IRP_ACCOUNT> 
</T0020> 

我已經給定的樣本輸出與只元件以節省空間。

我曾嘗試以下XSLT,但它是不是給渴望結果

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="/ROWSET"> 
<xsl:element name="T0020"> 
<xsl:apply-templates select="irp_account"/> 
</xsl:element> 
</xsl:template> 
<xsl:template match="irp_account"> 
<xsl:element name="IRP_ACCOUNT"> 
<xsl:apply-templates select="IRP_CARRIER_ID_NUMBER"/> 
<xsl:apply-templates select="IRP_ACCOUNT_NUMBER"/> 
<xsl:apply-templates select="IRP_ACCOUNT_TYPE"/> 
<xsl:apply-templates select="NAME_TYPE"/> 
<xsl:apply-templates select="ADDRESS_TYPE"/> 
</xsl:element> 
</xsl:template> 
<xsl:template match="IRP_CARRIER_ID_NUMBER"> 
<xsl:copy-of select="descendant-or-self::IRP_CARRIER_ID_NUMBER"/> 
</xsl:template> 
<xsl:template match="IRP_ACCOUNT_NUMBER"> 
<xsl:copy-of select="descendant-or-self::IRP_ACCOUNT_NUMBER"/> 
</xsl:template> 
<xsl:template match="IRP_ACCOUNT_TYPE"> 
<xsl:copy-of select="descendant-or-self::IRP_ACCOUNT_TYPE"/> 
</xsl:template> 
<xsl:template match="NAME_TYPE"> 
<xsl:element name="IRP_NAME"> 
<xsl:copy-of select="descendant-or-self::NAME_TYPE"/> 
<xsl:copy-of select="following-sibling::NAME"/> 
</xsl:element> 
</xsl:template> 
<xsl:template match="ADDRESS_TYPE"> 
<xsl:element name="IRP_ADDRESS"> 
<xsl:copy-of select="descendant-or-self::ADDRESS_TYPE"/> 
<xsl:copy-of select="following-sibling::NAME"/> 
</xsl:element> 
</xsl:template> 
</xsl:stylesheet> 

請幫

回答

0

你以爲複雜的。文字元素按原樣輸出 - 如果需要動態生成標記名,請使用xsl:element。還要注意使用<xsl:copy>來逐字複製什麼不需要改變。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="/ROWSET"> 
    <T0020> 
     <xsl:apply-templates/> 
    </T0020> 
</xsl:template> 

<xsl:template match="/ROWSET/irp_account"> 
    <IRP_ACCOUNT> 
     <xsl:copy-of select="IRP_CARRIER_IP_NUMBER"/> 
     <xsl:copy-of select="IRP_ACCOUNT_NUMBER"/> 
     <xsl:if test="NAME"> 
      <IRP_NAME> 
       <xsl:copy-of select="NAME"/> 
       <xsl:copy-of select="NAME_TYPE"/> 
      </IRP_NAME> 
     </xsl:if> 
     <xsl:if test="ADDRESS_TYPE"> 
      <IRP_ADDRESS> 
       <xsl:copy-of select="ADDRESS_TYPE"/> 
      </IRP_ADDRESS> 
     </xsl:if> 
    </IRP_ACCOUNT> 
</xsl:template> 
</xsl:stylesheet> 

將多個項目你可以不喜歡一樣IRP_CARRIER_IP_NUMBER:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:variable name="accounts" select="/ROWSET/irp_account"/> 
    <xsl:template match="/ROWSET"> 
    <T0020> 
    <xsl:for-each select="$accounts"> 
     <xsl:variable name="pos" select="position()"/> 
     <xsl:variable name="num" select="./IRP_ACCOUNT_NUMBER/text()"/> 
     <xsl:if test="count($accounts[position() &lt; $pos]/IRP_ACCOUNT_NUMBER[text()=$num])=0"> 
     <xsl:variable name="all-accounts" select="$accounts[IRP_ACCOUNT_NUMBER/text() = $num]"/> 
     <IRP_ACCOUNT> 
      <xsl:copy-of select="IRP_ACCOUNT_NUMBER"/> 
      <xsl:if test="$all-accounts[NAME_TYPE]"> 
      <IRP_NAME> 
       <!-- note: we just take the first name, and don't check 
       if the name is the same for all releated accounts --> 
       <xsl:copy-of select="NAME"/> 
       <!-- note: we just list all name types, and don't check 
       for duplicates --> 
       <xsl:for-each select="$all-accounts"> 
       <xsl:copy-of select="NAME_TYPE"/> 
       </xsl:for-each> 
      </IRP_NAME> 
      </xsl:if> 
      <xsl:if test="$all-accounts[ADDRESS_TYPE]"> 
      <IRP_ADDRESS> 
       <!-- note: we just list all address types, and don't check 
       for duplicates --> 
       <xsl:for-each select="$all-accounts"> 
       <xsl:copy-of select="ADDRESS_TYPE"/> 
       </xsl:for-each> 
      </IRP_ADDRESS> 
      </xsl:if> 
     </IRP_ACCOUNT> 
     </xsl:if> 
    </xsl:for-each> 
    </T0020> 
</xsl:template> 

(不要忘記接受的答案,如果這是有幫助的)

0

感謝羅蘭你的回答它是非常有用的,當我transorm使用這個

<?xml version = '1.0'?> 
<ROWSET> 
    <irp_account num="97"> 
     <IRP_CARRIER_ID_NUMBER>957858</IRP_CARRIER_ID_NUMBER> 
     <IRP_ACCOUNT_NUMBER>59940</IRP_ACCOUNT_NUMBER> 
     <IRP_ACCOUNT_TYPE>I</IRP_ACCOUNT_TYPE> 
     <NAME_TYPE>LG</NAME_TYPE> 
     <NAME>SONNY DAVIS INC</NAME> 
     <ADDRESS_TYPE>MA</ADDRESS_TYPE> 
    </irp_account> 
    <irp_account num="98"> 
     <IRP_CARRIER_ID_NUMBER>957858</IRP_CARRIER_ID_NUMBER> 
     <IRP_ACCOUNT_NUMBER>59940</IRP_ACCOUNT_NUMBER> 
     <IRP_ACCOUNT_TYPE>I</IRP_ACCOUNT_TYPE> 
     <NAME_TYPE>LG</NAME_TYPE> 
     <NAME>SONNY DAVIS INC</NAME> 
     <ADDRESS_TYPE>PH</ADDRESS_TYPE> 
    </irp_account>  
</ROWSET> 

它給了我下面的輸出

<?xml version="1.0" encoding="utf-8" ?> 
<T0020> 
<IRP_ACCOUNT> 
    <IRP_ACCOUNT_NUMBER>59940</IRP_ACCOUNT_NUMBER> 
    <IRP_NAME> 
     <NAME>SONNY DAVIS INC</NAME> 
     <NAME_TYPE>LG</NAME_TYPE> 
    </IRP_NAME> 
    <IRP_ADDRESS> 
     <ADDRESS_TYPE>MA</ADDRESS_TYPE> 
    </IRP_ADDRESS> 
    </IRP_ACCOUNT> 

    <IRP_ACCOUNT> 
     <IRP_ACCOUNT_NUMBER>59940</IRP_ACCOUNT_NUMBER> 
     <IRP_NAME> 
      <NAME>SONNY DAVIS INC</NAME> 
      <NAME_TYPE>LG</NAME_TYPE> 
     </IRP_NAME> 
     <IRP_ADDRESS> 
      <ADDRESS_TYPE>PH</ADDRESS_TYPE> 
     </IRP_ADDRESS> 
    </IRP_ACCOUNT> 
</T0020> 

現在是有可能,我的輸出XML進來以下格式

<?xml version="1.0" encoding="utf-8" ?> 
    <T0020> 
    <IRP_ACCOUNT> 
     <IRP_ACCOUNT_NUMBER>59940</IRP_ACCOUNT_NUMBER> 
     <IRP_NAME> 
      <NAME>SONNY DAVIS INC</NAME> 
      <NAME_TYPE>LG</NAME_TYPE> 
      <IRP_ADDRESS> 
        <ADDRESS_TYPE>MA</ADDRESS_TYPE> 
        <ADDRESS_TYPE>PH</ADDRESS_TYPE> 
      </IRP_ADDRESS> 
     </IRP_NAME>   
     </IRP_ACCOUNT> 

    </T0020> 

是否有可能,我可以分組地址類型像其他標籤的值(IRP_CARRIER_ID_NUMBER>)是相同的。

非常感謝精彩的幫助...

+0

好的。所以基本上,你想分組的項目具有相同的IRP_ACCOUNT_NUMBER?請在你的問題中更具體 – 2009-12-31 15:49:07

+0

好吧,所以我編輯了我的原始口水。你能否接受它並在單獨的線程中提出新的問題? TIA – 2009-12-31 16:15:45

+0

羅納德,感謝您的幫助。它非常有用。 – 2010-01-06 10:17:48

相關問題