2012-07-11 90 views
0

請有人幫助一個真正掙扎的新手。 我是XSL的新手,我無法解決這個問題。 我可以把它關閉,但不能得到<Material_Data>,<Material><Comp_Class>標籤排序。下面是源文件:XSLT根據其他標籤中的值創建新標籤

<?xml version="1.0" encoding="UTF-8"?> 
<Variable_Attributes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="C:\ZZ\Test Var Attribs.xsd"> 
    <Material>1</Material> 
    <Comp_Class>Aerosol - Aluminium</Comp_Class> 
    <Material_Data> 
     <Field_Name>ZMDM_Diameter</Field_Name> 
     <Field_Value>45</Field_Value> 
     <Field_Name>ZMDM_Height</Field_Name> 
     <Field_Value>60</Field_Value> 
     <Field_Name>ZMDM_Supplier</Field_Name> 
     <Field_Value>Tony</Field_Value> 
     <Field_Name>ZMDM_Brimful</Field_Name> 
     <Field_Value>78</Field_Value> 
     <Field_Name>ZMDM_Size</Field_Name> 
     <Field_Value>440</Field_Value> 
    </Material_Data> 
    <Material>2</Material> 
    <Comp_Class>Aerosol Valves</Comp_Class> 
    <Material_Data> 
     <Field_Name>ZMDM_UoM</Field_Name> 
     <Field_Value>EA</Field_Value> 
     <Field_Name>ZMDM_Free_Text</Field_Name> 
     <Field_Value>Test Aerosol</Field_Value> 
     <Field_Name>ZMDM_Size</Field_Name> 
     <Field_Value>18</Field_Value> 
    </Material_Data> 
</Variable_Attributes> 

什麼,我需要得到的是:

<?xml version="1.0" encoding="UTF-8"?> 
<Material_Data> 
    <Material>1</Material> 
    <Comp_Class>Aerosol - Aluminium</Comp_Class> 
    <ZMDM_Diameter>45</ZMDM_Diameter> 
    <ZMDM_Height>60</ZMDM_Height> 
    <ZMDM_Supplier>Tony</ZMDM_Supplier> 
    <ZMDM_Brimful>78</ZMDM_Brimful> 
    <ZMDM_Size>440</ZMDM_Size> 
    <ZMDM_UoM>EA</ZMDM_UoM> 
</Material_Data> 
<Material_Data> 
    <Material>2</Material> 
    <Comp_Class>Aerosol Valves</Comp_Class> 
    <ZMDM_Free_Text>Test Aerosol</ZMDM_Free_Text> 
    <ZMDM_Size>18</ZMDM_Size> 
</Material_Data> 

任何幫助將非常感激。

在此先感謝

史蒂夫

下面是我到目前爲止已經試過:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
    <xsl:strip-space elements="*"/> 
    <xsl:template match="/"> 
     <Material_Data> 
      <xsl:for-each select="/Variable_Attributes/Material_Data/Field_Name"> 
       <xsl:variable name="val" select="current()"/> 
       <xsl:variable name="val2" select="current()/following-sibling::*[1]"/> 
       <xsl:element name="{$val}"> 
        <xsl:value-of select="$val2"/> 
       </xsl:element> 
      </xsl:for-each> 
     </Material_Data> 
    </xsl:template> 
</xsl:stylesheet> 
+1

您期望的輸出文檔的格式不正確。你只能有一個根元素。請更新您的問題以獲得有效的期望。 – 2012-07-12 00:51:13

回答

2

而不是使用xsl:for-each,採用了基於模板的方法嘗試的。

XSLT 1.0

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

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

    <xsl:template match="Variable_Attributes"> 
     <xsl:copy> 
      <xsl:apply-templates select="Material_Data|@*"/> 
     </xsl:copy>  
    </xsl:template> 

    <xsl:template match="Material_Data"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*"/> 
      <xsl:apply-templates select="preceding-sibling::Material[1]"/> 
      <xsl:apply-templates select="preceding-sibling::Comp_Class[1]"/> 
      <xsl:apply-templates select="Field_Name"/> 
     </xsl:copy>  
    </xsl:template> 

    <xsl:template match="Field_Name"> 
     <xsl:element name="{.}"> 
      <xsl:apply-templates select="following-sibling::Field_Value[1]"/> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="Field_Value"> 
     <xsl:apply-templates select="node()"/> 
    </xsl:template> 

</xsl:stylesheet> 

輸出

<Variable_Attributes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xsi:noNamespaceSchemaLocation="C:\ZZ\Test Var Attribs.xsd"> 
    <Material_Data> 
     <Material>1</Material> 
     <Comp_Class>Aerosol - Aluminium</Comp_Class> 
     <ZMDM_Diameter>45</ZMDM_Diameter> 
     <ZMDM_Height>60</ZMDM_Height> 
     <ZMDM_Supplier>Tony</ZMDM_Supplier> 
     <ZMDM_Brimful>78</ZMDM_Brimful> 
     <ZMDM_Size>440</ZMDM_Size> 
    </Material_Data> 
    <Material_Data> 
     <Material>2</Material> 
     <Comp_Class>Aerosol Valves</Comp_Class> 
     <ZMDM_UoM>EA</ZMDM_UoM> 
     <ZMDM_Free_Text>Test Aerosol</ZMDM_Free_Text> 
     <ZMDM_Size>18</ZMDM_Size> 
    </Material_Data> 
</Variable_Attributes> 
+0

DevNull。我只是不能夠感謝你。我很感激。 感謝上帝爲你和計算器。 – 2012-07-12 05:13:05

+2

DevNull沒有做的是指出你出錯的地方。使用帶for-each的拉式樣式表很可能解決問題;但是對於輸出層次結構中的每個級別,每個「循環」都需要一個,並且缺少一個級別。 – 2012-07-12 07:14:03

+0

@MichaelKay - 是的,謝謝你的評論。我錯過了答案中最重要的部分! – 2012-07-12 16:24:11

相關問題