2013-01-07 38 views
3

我有,我想分析創建HTML下面的XML文件。我的問題是,我無法解析它,因爲我想。XSLT - 如何閱讀所有子節點有序,具有相同和不同的名稱標籤

我想要做的是HTML輸出我<items>。所以,我希望有一個<paragraph>成爲<div><image>是一個<img>及其子節點是它的屬性「SRC」和「ALT」。

<itemlist> 
    <item> 
     <paragraph>pA</paragraph> 
     <image> 
      <url>http://www.com/image.jpg</url> 
      <title>default image</title> 
     </image> 
     <paragraph>pB</paragraph> 
     <paragraph>pC</paragraph> 
     <link target='#'>linkA</link> 
     <paragraph>pD</paragraph> 
     <link target='#' >linkB</link> 
     <image> 
      <url>http://www.com/image2.jpg</url> 
      <title>default image 2</title> 
     </image> 
     </item> 
     <item>  
     <paragraph>pB</paragraph> 
     <paragraph>pC</paragraph> 
     <image> 
      <url>http://www.com/image2.jpg</url> 
      <title>default image 2</title> 
     </image> 
     <link target='#'>linkA</link> 
     <paragraph>pD</paragraph> 
     <link target='#'>linkB</link> 
     </item> 
    </itemlist> 

如果我上<item> foreach循環和通過應用模板,如匹配=「段」值寫入隨後匹配=「圖像」,那麼所有<paragraph><image>,這將之前寫入不會導致正確的輸出。

下面是我期待的輸出。任何人有一個想法如何做到這一點?

<div id="item"> 
    <div>pA</div> 
    <img src='http://www.com/image.jpg' title='default image' /> 
    <div>pB</div> 
    <div>pC</div> 
    <a href='#'>linkA</a> 
    <div>pD</div> 
    <img src='http://www.com/image2.jpg' title='default image 2' /> 
</div> 
<div id="item"> 
    <div>pB</div> 
    <div>pC</div> 
    <img src='http://www.com/image2.jpg' title='default image 2' /> 
    <a href='#'>linkA</a> 
    <div>pD</div> 
    <a href='#'>linkB</a> 
</div> 

-----編輯---- 目前,我有這樣的事情

<xsl:for-each select="itemlist/item"> 
<xsl:apply-templates select="paragraph"/> 
<xsl:apply-templates select="link"/> 


    <xsl:template match="paragraph"> 
<xsl:value-of select="." /> 
    </xsl:template> 

    <xsl:template match="link"> 
<xsl:value-of select="." /> 
    </xsl:template> 


</xsl:for-each> 

回答

2

這是你在找什麼? :

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" encoding="UTF-8" /> 

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

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

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

</xsl:stylesheet> 
+0

雖然你的答案確實輸出我顯示的結果。它對我來說似乎並不正確。我已經加入我與 – Daniel

+0

@Daniel此解決方案使用的代碼,誤差必須在你身邊。請參閱http://www.xmlplayground.com/SaB3U9。 – Tomalak

+2

Stefanos,一方面注意:'match'表達式不需要完整的XPath表達式。 '等就足夠了。 – Tomalak

相關問題