2017-05-24 47 views
1

我需要使用xslt將xml文件轉換爲另一個xml文件。 輸入文件是如下:XML轉換

<root type="object"> 
    <items type="array"> 
     <item type="object"> 
      <updated_at type="string">2017-05-20</updated_at> 
      <external_id type="null"></external_id> 
      <created_at type="string">2017-05-20</created_at> 
      <embed_code type="string">ec111</embed_code> 
      <status type="string">live</status> 
      <content_type type="string">video</content_type> 
      <name type="string"></name> 
      <hosted_at type="null"></hosted_at> 
     </item> 
     <item type="object"> 
      <updated_at type="string">2017-05-19</updated_at> 
      <external_id type="null"></external_id> 
      <labels type="array"> 
       <item type="object"> 
        <name type="string">lbl name 1</name> 
        <full_name type="string">full lbl name 1</full_name> 
        <id type="string">lbl1</id> 
        <parent_id type="string">parent_id_1</parent_id> 
       </item> 
      </labels> 
      <created_at type="string">2017-05-20</created_at> 
      <embed_code type="string">ec112</embed_code> 
      <status type="string">live</status> 
      <content_type type="string">video</content_type> 
      <name type="string">test</name> 
      <hosted_at type="null"></hosted_at> 
     </item> 
     <item type="object"> 
      <updated_at type="string">2017-05-19</updated_at> 
      <external_id type="null"></external_id> 
      <labels type="array"> 
       <item type="object"> 
        <name type="string">lbl name 2</name> 
        <full_name type="string">full lbl name 2</full_name> 
        <id type="string">lbl2</id> 
        <parent_id type="string">parent_id_2</parent_id> 
       </item> 
       <item type="object"> 
        <name type="string">lbl name 3</name> 
        <full_name type="string">full lbl name 3</full_name> 
        <id type="string">lbl3</id> 
        <parent_id type="string">parent_id_3</parent_id> 
       </item> 
      </labels> 
      <created_at type="string">2017-05-20</created_at> 
      <embed_code type="string">ec113</embed_code> 
      <status type="string">live</status> 
      <content_type type="string">video</content_type> 
      <name type="string">testing</name> 
      <hosted_at type="null"></hosted_at> 
     </item> 
    </items> 
</root> 

需要將上面的XML變換,以下面的格式:

<?xml version="1.0"?> 
<labels> 
    <item> 
     <embed_code>ec112</embed_code> 
     <name>lbl name 1</name> 
     <full_name>full lbl name 1</full_name> 
     <id>lbl1</id> 
     <parent_id>parent_id_1</parent_id> 
    </item> 
    <item> 
     <embed_code>ec113</embed_code> 
     <name>lbl name 2</name> 
     <full_name>full lbl name 2</full_name> 
     <id>lbl2</id> 
     <parent_id>parent_id_2</parent_id> 
    </item> 
    <item> 
     <embed_code>ec113</embed_code> 
     <name>lbl name 3</name> 
     <full_name>full lbl name 3</full_name> 
     <id>lbl3</id> 
     <parent_id>parent_id_3</parent_id> 
    </item> 
</labels> 

路徑根/項目/項目將具有embed_code標籤。並且在相同的路徑中它可能有標籤節點或者可能沒有標籤。標籤可能有一個或多個項目。

轉換規則如下: 1)需要獲取標籤和他們的孩子 2)刪除所有屬性 3)把embed_code節點到每個標籤/ item節點

下面是我到目前爲止的代碼:

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

    <xsl:template match="/"> 
     <labels> 
      <xsl:for-each select="root/items/item"> 
      <xsl:variable name="eCode" select="embed_code"/> 
      <xsl:for-each select="labels/*"> 
      <item> 
       <embed_code> 
        <xsl:value-of select="$eCode"/> 
       </embed_code> 

       <xsl:for-each select="root/items/item/labels/item/*"> 

       </xsl:for-each> 
      </item> 
      </xsl:for-each> 
      </xsl:for-each> 
     </labels> 
    </xsl:template> 

    <xsl:template match="@*" /> 
    </xsl:stylesheet> 

無法攜帶標籤/項目的子節點。請幫助我。

感謝

+1

不要將工作分配轉儲到堆棧溢出。做你自己的工作。如果您對目前正在撰寫的XSLT樣式表有疑問,請發佈您的代碼並詢問具體問題,我們很樂意提供幫助。 – Tomalak

+0

我已編輯該帖子以包括我迄今爲止的xslt工作。我想帶標籤/項目的子節點。 –

+0

這樣比較好。始終包含您的代碼和問題描述。 – Tomalak

回答

0

你是無法去標籤/項目的子節點,因爲你是在

<xsl:for-each select="root/items/item/labels/item/*"> 

</xsl:for-each> 

使用錯誤的道路有在任何<item>沒有root。看起來你試圖使用絕對路徑,這也是錯誤的。

改爲使用相對路徑。 *已足以獲取所有子元素,因爲<xsl:for-each>已將您的上下文節點移動到<item>。比較:

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

    <xsl:template match="/"> 
     <labels> 
      <xsl:for-each select="root/items/item/labels/item"> 
       <item> 
        <embed_code> 
         <xsl:value-of select="../../embed_code"/> 
        </embed_code> 

        <xsl:for-each select="*"> 
         <xsl:copy> 
          <xsl:value-of select="." /> 
         </xsl:copy> 
        </xsl:for-each> 
       </item> 
      </xsl:for-each> 
     </labels> 
    </xsl:template> 

</xsl:stylesheet> 

  • 嵌套<xsl:for-each>像你這樣是不是真的有必要,單一的,每個做同樣的事情
  • <xsl:copy>複製當前節點的輸出,你可以使用它如果你想保留節點名稱

以上輸入的結果:

<labels xmlns:a="item"> 
    <item> 
     <embed_code>ec112</embed_code> 
     <name>lbl name 1</name> 
     <full_name>full lbl name 1</full_name> 
     <id>lbl1</id> 
     <parent_id>parent_id_1</parent_id> 
    </item> 
    <item> 
     <embed_code>ec113</embed_code> 
     <name>lbl name 2</name> 
     <full_name>full lbl name 2</full_name> 
     <id>lbl2</id> 
     <parent_id>parent_id_2</parent_id> 
    </item> 
    <item> 
     <embed_code>ec113</embed_code> 
     <name>lbl name 3</name> 
     <full_name>full lbl name 3</full_name> 
     <id>lbl3</id> 
     <parent_id>parent_id_3</parent_id> 
    </item> 
</labels> 
+1

'xmlns:a =「item」'部分是做什麼的? –