2013-01-07 37 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

相关问题