2013-03-18 45 views
0

這是我簡單的XML文件: -科瑞XML元素值與標籤名相同屬性

<products> 
    <value> 
     <value> 
      <region_timezone> 
       <value>1</value> 
      </region_timezone> 
      <registrationstatus> 
       <value>2</value> 
      </registrationstatus> 
      <eventstatus> 
       <value>2</value> 
      </eventstatus> 
      <dist_activity> 
       <value>5</value> 
       <value>10068</value> 
       <value>10070</value> 
      </dist_activity> 
      <reg_str_dt> 
       <value>2013-01-14 20:35:00</value> 
      </reg_str_dt> 
      <reg_end_dt> 
       <value>2013-01-14 20:35:00</value> 
      </reg_end_dt> 
      <product_id>1</product_id> 
      <tab_id>351</tab_id> 
      <tab_name>test1</tab_name> 
     </value> 
    </value> 
    <value> 
     <value> 
      <region_timezone> 
       <value>1</value> 
      </region_timezone> 
      <registrationstatus> 
       <value>2</value> 
      </registrationstatus> 
      <eventstatus> 
       <value>2</value> 
      </eventstatus> 
      <dist_activity> 
       <value>5</value> 
       <value>10069</value> 
       <value>10070</value> 
      </dist_activity> 
      <reg_str_dt> 
       <value>2013-02-14 20:39:00</value> 
      </reg_str_dt> 
      <reg_end_dt> 
       <value>2013-02-14 20:39:00</value> 
      </reg_end_dt> 
      <product_id>2</product_id> 
      <tab_id>352</tab_id> 
      <tab_name>test2</tab_name> 
     </value> 
    </value> 
</products> 

我試試這個XSLT: -

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

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

    <xsl:template match="products/value/value"> 
    <product_id value="{product_id}"> 
     <tab_id value="{tab_id}"> 
     <tab_name value="{tab_name}" /> 
     <xsl:apply-templates select="node()" /> 
     </tab_id> 
    </product_id> 
    </xsl:template> 

    <xsl:template match="@* | node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="self::*[value[not(*)]]" 
          mode="values" /> 
     <xsl:apply-templates select="@* | node()" /> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="value[not(*)]" /> 

    <xsl:template match="*" mode="values"> 
    <xsl:attribute name="value"> 
     <xsl:apply-templates select="value[not(*)]" mode="values"/> 
    </xsl:attribute> 
    </xsl:template> 

    <xsl:template match="value" mode="values"> 
    <xsl:value-of select="concat(., ',')"/> 
    </xsl:template> 

    <xsl:template match="value[last()]" mode="values"> 
    <xsl:value-of select="."/> 
    </xsl:template> 

    <xsl:template match="product_id | tab_id | tab_name" /> 
</xsl:stylesheet> 

由於採用這種XSLT的: - 我做O/p是這樣的類型: -

<products> 
    <product_id value="1"> 
    <tab_id value="351"> 
     <tab_name value="test1" /> 
     <region_timezone value="1" /> 
     <registrationstatus value="2" /> 
     <eventstatus value="2" /> 
     <dist_activity value="5,10068,10070" /> 
     <reg_str_dt value="2013-01-14 20:35:00" /> 
     <reg_end_dt value="2013-01-14 20:35:00" /> 
    </tab_id> 
    </product_id> 
    <product_id value="2"> 
    <tab_id value="352"> 
     <tab_name value="test2" /> 
     <region_timezone value="1" /> 
     <registrationstatus value="2" /> 
     <eventstatus value="2" /> 
     <dist_activity value="5,10069,10070" /> 
     <reg_str_dt value="2013-02-14 20:39:00" /> 
     <reg_end_dt value="2013-02-14 20:39:00" /> 
    </tab_id> 
    </product_id> 
</products> 

,但我需要這種類型的O/p的: -

<products> 
    <product_id value="1"> 
    <tab_id value="351"> 
     <tab_name value="test1" /> 
     <region_timezone value="1" /> 
     <registrationstatus value="2" /> 
     <eventstatus value="2" /> 
     <dist_activity value="5" /> 
     <dist_activity value="10068" /> 
     <dist_activity value="10070" /> 
     <reg_str_dt value="2013-01-14 20:35:00" /> 
     <reg_end_dt value="2013-01-14 20:35:00" /> 
    </tab_id> 
    </product_id> 
    <product_id value="2"> 
    <tab_id value="352"> 
     <tab_name value="test2" /> 
     <region_timezone value="1" /> 
     <registrationstatus value="2" /> 
     <eventstatus value="2" /> 
     <dist_activity value="5" /> 
     <dist_activity value="10069" /> 
     <dist_activity value="10070" /> 
     <reg_str_dt value="2013-02-14 20:39:00" /> 
     <reg_end_dt value="2013-02-14 20:39:00" /> 
    </tab_id> 
    </product_id> 
</products> 

這裏我不需要逗號分開(,)在我目前的O/P。我想如上XML輸出這樣的元素attiribute值分開: -

  <dist_activity value="5" /> 
      <dist_activity value="10069" /> 
      <dist_activity value="10070" /> 

請大家幫我出這個
如果可能的...
感謝......

回答

0

這將做到這一點:

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

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

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

    <xsl:template match="products/value/value"> 
    <product_id value="{product_id}"> 
     <tab_id value="{tab_id}"> 
     <tab_name value="{tab_name}" /> 
     <xsl:apply-templates select="node()" /> 
     </tab_id> 
    </product_id> 
    </xsl:template> 

    <xsl:template match="*[value[not(*)]]"> 
    <xsl:apply-templates select="value[not(*)]" /> 
    </xsl:template> 

    <xsl:template match="value[not(*)]"> 
    <xsl:element name="{name(..)}"> 
     <xsl:attribute name="value"> 
     <xsl:value-of select="." /> 
     </xsl:attribute> 
     <xsl:apply-templates select="../@* | ../node()[not(self::value[not(*)])]" /> 
    </xsl:element> 
    </xsl:template> 

    <xsl:template match="product_id | tab_id | tab_name" /> 
</xsl:stylesheet> 

當你的樣品輸入運行,這將產生:

<products> 
    <product_id value="1"> 
    <tab_id value="351"> 
     <tab_name value="test1" /> 
     <region_timezone value="1" /> 
     <registrationstatus value="2" /> 
     <eventstatus value="2" /> 
     <dist_activity value="5" /> 
     <dist_activity value="10068" /> 
     <dist_activity value="10070" /> 
     <reg_str_dt value="2013-01-14 20:35:00" /> 
     <reg_end_dt value="2013-01-14 20:35:00" /> 
    </tab_id> 
    </product_id> 
    <product_id value="2"> 
    <tab_id value="352"> 
     <tab_name value="test2" /> 
     <region_timezone value="1" /> 
     <registrationstatus value="2" /> 
     <eventstatus value="2" /> 
     <dist_activity value="5" /> 
     <dist_activity value="10069" /> 
     <dist_activity value="10070" /> 
     <reg_str_dt value="2013-02-14 20:39:00" /> 
     <reg_end_dt value="2013-02-14 20:39:00" /> 
    </tab_id> 
    </product_id> 
</products> 
+0

謝謝它的完成... – 2013-03-18 09:11:51