XSLT - 如何按顺序读取所有子节点,具有相同和不同的名称标记

时间:2013-01-07 19:55:11

标签: xml xslt xpath

我有以下要解析的XML文件来创建HTML。我的问题是我无法按照自己的意愿解析它。

我想要做的是输出我的<items>作为html。所以我希望<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循环并通过应用模板来写入值,例如match ='paragraph',然后是match ='image',那么所有<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>

1 个答案:

答案 0 :(得分: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>