使用XSLT在XML中重复一个TAG块

时间:2011-10-12 05:00:03

标签: html xml xslt

我有另一个查询,我尝试但无法完成... 以下是XML代码 -

<Main>
<Region>
<Division>
<DivName>Abc</DivName>
<Desc>BBB</Desc>
<Info></Info>
</Division>
<Division>
<DivName>Pqr</DivName>
<Desc></Desc>
<Info></Info>
</Division>
<Division>
.
.
.
</Division>
</Region>
</Main>

在Division标签中,DivName是强制性的,即;它会在那里,但Desc和Info是可选的。此处包含Desc,DivName和Info标记的Division标记只能出现一次。所以要显示它,我必须使用for-each。

我还想在这些标签之间换行。直到现在我尝试了一点失败。我想要的HTML输出是

<b>DivName Text</b>
<p>Desc Text, if any</p>
<p>Info Text, if any</p>
<hr/>
<b>DivName Text</b>
<p>Desc Text, if any</p>
<p>Info Text, if any</p>

提前致谢.. 祝你今天愉快 约翰

2 个答案:

答案 0 :(得分:0)

这个怎么样:

<xsl:for-each select="Division">
  <xsl:if test="position() != 1">
  <hr/>
  </xsl:if>
  <p><xsl:value-of select="DivName" /></p>
  <xsl:if test="Desc">
    <p><xsl:value-of select="Desc"/></p>
  </xsl:if>
  <xsl:if test="Info">
    <p><xsl:value-of select="Info"/></p>
  </xsl:if>
</xsl:for-each>

答案 1 :(得分:0)

这个简单的转换(没有<xsl:for-each>且没有条件):

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

 <xsl:template match="Division[position() >1]">
     <hr />
     <xsl:apply-templates/>
 </xsl:template>

 <xsl:template match="Division/*[text()]">
  <p><xsl:value-of select="."/></p>
 </xsl:template>
</xsl:stylesheet>

应用于此XML文档时

<Main>
    <Region>
        <Division>
            <DivName>Abc</DivName>
            <Desc>BBB</Desc>
            <Info>More info abour Abc</Info>
        </Division>
        <Division>
            <DivName>Pqr</DivName>
            <Desc>Pqr desc.</Desc>
            <Info>More info abour Pqr</Info>
        </Division>
    </Region>
</Main>

生成想要的正确结果

<p>Abc</p>
<p>BBB</p>
<p>More info abour Abc</p>
<hr/>
<p>Pqr</p>
<p>Pqr desc.</p>
<p>More info abour Pqr</p>

浏览器将其显示为

ABC

BBB

更多信息abour Abc


PQR

Pqr desc。

更多信息abour Pqr