2013-12-10 82 views
-1

蒂姆 - 謝謝!您根據我的輸入提供的內容當然可行!然而,我卻是我自己的自我的犧牲品。我最初的輸入是我的實際XML文件的結構縮小版本,我想我能夠應用你的幫助的概念,並得到我最終需要的東西......猜猜看是什麼?儘管變化很小,但我依然不能。代碼的一些很好的變化/調整,包括在「copy-of select =」中使用完整路徑,不會將KEY放在DOCUMENT下。它唯一的工作方式是當我使用「xsl:copy-of select =」// KEY「/」時。移動父級元素到循環組的子元素

我遇到的另一個問題是如何確保只有「文檔」所在的「KEY」被複制到該「文檔」下...使用「原樣」代碼,將所有元素XML被複制到每個節點(同樣,只有當我使用「//」運算符時)。

請幫忙。

這裏是我的未按比例縮小的結構:

<?xml version='1.0' encoding='utf-8' ?> 
<Root> 
     <Level1> 
       <KEY><![CDATA[keyword1]]></KEY> 
       <Documents> 
          <Document> 
            <TYPE>type1</TYPE> 
            <IMAGE><![CDATA[string11]]></IMAGE> 
          </Document> 
          <Document> 
            <TYPE>type2</TYPE> 
            <IMAGE><![CDATA[string12]]></IMAGE> 
          </Document> 
          <Document> 
            <TYPE>type3</TYPE> 
            <IMAGE><![CDATA[string13]]></IMAGE> 
          </Document> 
       </Documents> 
     </Level1> 
     <Level1> 
       <KEY><![CDATA[keyword2]]></KEY> 
       <Documents> 
          <Document> 
            <TYPE>type1</TYPE> 
            <IMAGE><![CDATA[string21]]></IMAGE> 
          </Document> 
          <Document> 
            <TYPE>type2</TYPE> 
            <IMAGE><![CDATA[string22]]></IMAGE> 
          </Document> 
          <Document> 
            <TYPE>type3</TYPE> 
            <IMAGE><![CDATA[string23]]></IMAGE> 
          </Document> 
       </Documents> 
     </Level1> 
</Root> 

我想要的結果:

<?xml version='1.0' encoding='utf-8' ?> 
<Root> 
     <Level1> 
       <Documents> 
          <Document> 
            <KEY><![CDATA[keyword1]]></KEY> 
            <TYPE>type1</TYPE> 
            <IMAGE><![CDATA[string11]]></IMAGE> 
          </Document> 
          <Document> 
            <KEY><![CDATA[keyword1]]></KEY> 
            <TYPE>type2</TYPE> 
            <IMAGE><![CDATA[string12]]></IMAGE> 
          </Document> 
          <Document> 
            <KEY><![CDATA[keyword1]]></KEY> 
            <TYPE>type3</TYPE> 
            <IMAGE><![CDATA[string13]]></IMAGE> 
          </Document> 
       </Documents> 
     </Level1> 
     <Level1> 
       <Documents> 
          <Document> 
            <KEY><![CDATA[keyword2]]></KEY> 
            <TYPE>type1</TYPE> 
            <IMAGE><![CDATA[string21]]></IMAGE> 
          </Document> 
          <Document> 
            <KEY><![CDATA[keyword2]]></KEY> 
            <TYPE>type2</TYPE> 
            <IMAGE><![CDATA[string22]]></IMAGE> 
          </Document> 
          <Document> 
            <KEY><![CDATA[keyword2]]></KEY> 
            <TYPE>type3</TYPE> 
            <IMAGE><![CDATA[string23]]></IMAGE> 
          </Document> 
       </Documents> 
     </Level1> 
</Root> 

對不起......,並再次感謝你。

+0

你爲什麼不有什麼不工作了嗎?你真的嘗試過什麼? – Hilikus

回答

1

首先,你需要在identity transform讀了,它看起來像這樣

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

這將所有輸出文件的拷貝節點沒有改變。這意味着你只需要爲你需要改變的東西編寫模板。

你也不應該真的想到移動元素,而是兩個變化;從文檔元件下除去KEY元件,然後將文獻下添加新KEY元件(即現有的一個的副本)。

刪除KEY元素是直截了當的。只是比賽了,什麼事都不做

<xsl:template match="KEY" /> 

文檔元素下添加新的元素,也是直截了當。您需要一個與模板匹配的模板,該模板與身份模板類似,但具有額外的副本,可以從父級複製KEY節點。

<xsl:template match="Document"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*"/> 
     <xsl:copy-of select="../KEY" /> 
     <xsl:apply-templates select="node()"/> 
    </xsl:copy> 
</xsl:template> 

所以,你複製文件元素,整個複製的屬性(如果有的話),從父複製KEY,然後繼續處理子節點。

以下是完整的XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="KEY" /> 

    <xsl:template match="Document"> 
     <xsl:copy> 
     <xsl:apply-templates select="@*"/> 
     <xsl:copy-of select="../KEY" /> 
     <xsl:apply-templates select="node()"/> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

編輯:作爲替代方案,如果KEY不是父節點的孩子,但可以在任何深度,嘗試用這個,而不是替換副本聲明

<xsl:copy-of select="ancestor::*[KEY]/KEY" /> 

這應該與文檔元件是在任何級別對​​應。

0

好的,最後....這是蒂姆的原始xsl(有一個微小的調整),這給了我想要的結果。蒂姆 - 再次感謝。 XSLT超出了我的專業領域。我只是想用它的「準備」工具:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" indent="yes"/> 
<xsl:template match="@*|node()"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 

<xsl:template match="KEY" /> 

<xsl:template match="Document"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*"/> 
    <xsl:copy-of select="../../KEY" /> 
    <xsl:apply-templates select="node()"/> 
    </xsl:copy> 
</xsl:template> 
</xsl:stylesheet> 
+0

我已經對我的原始答案進行了編輯,以處理** Document **元素嵌套到更深層次的問題,因此將使用原始XML和最新示例。 –