在for-each中仅显示一次标题

时间:2009-06-16 11:19:21

标签: xslt

说我有以下XML:

<a>
  <b>1</b>
  <b>2</b>
  <b>3</b>
</a>

...并要求:

Header
1
2
3

...但是像xslt一样:

<xsl:template match = "/" >  
  <xsl:variable name="headed" select="false()"/>
  <xsl:for-each select = "a/*" >
    <xsl:if test="not($headed)">
      <xsl:text>Header</xsl:text>
      <!-- 
        this next line causes a problem due to 
        the attempted reassignment of $headed
      -->
      <xsl:variable name="headed" select="true()"/>
    </xsl:if>
    <xsl:value-of select="." />
    <xsl:value-of select="'&#x0a;'"/>
  </xsl:for-each>
</xsl:template>

无效,任何人都可以推荐一个简短易读的解决方案吗?也许是一本很好的书来学习以下的功能性思维:)

干杯

西蒙

------------------------------ addendum ---------------- ----------

在思考了我已经提出的答案之后,我意识到我已经失去了我试图解决的问题的一些关键组成部分。

我的数据更像是:

<address>
  <line1>street</line1>
  <line2>town</line2>
  <line3>city</line3>
  <country>uk</country>
</address>

我想要的输出更像是:

<table>
  <tr><td rowspan="6" valign="top">Address</td><td>street</td></tr>
  <tr><td>town</td></tr>
  <tr><td>city</td></tr>
  <tr><td>uk</td></tr>
</table>

任何进一步的帮助将不胜感激。

3 个答案:

答案 0 :(得分:5)

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="a">Header
   <xsl:apply-templates/>
</xsl:template>

<xsl:template match="a/b">
  <xsl:apply-templates/>
</xsl:template>

</xsl:stylesheet>

几乎是你想要的,比你现在拥有的更简单。

答案 1 :(得分:1)

只需采取&lt; xsl:text&gt;标题&lt; / xsl:text&gt;出于每个......

答案 2 :(得分:1)

最终结果更像是:

        <?xml version="1.0" encoding="ISO-8859-1"?>
        <xsl:stylesheet  version = "1.0"
        xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" >

          <xsl:template match="/a">
            <html><body><table>
                <xsl:apply-templates select="*"/>
            </table></body></html>
          </xsl:template>


          <xsl:template match="a/*">
            <xsl:if test="not(.='')">
              <TR>
                <xsl:if test="position()=1">
    <!--
                  <TD rowspan="6" valign="top">Address</TD>
                 improved based on Tomalak's suggestion
    -->
              <xsl:element name="TD">
                <xsl:attribute name="rowspan" >
    <!--
                  <cough />
                  <xsl:value-of select="count(*)"/>
    -->
                  <xsl:value-of select="count(*[not(.='')]"/>
                </xsl:attribute>
                <xsl:attribute name="valign" >
                  <xsl:text>top</xsl:text>
                </xsl:attribute>
                <xsl:text>Address</xsl:text>
              </xsl:element>

                </xsl:if>
                <TD>
                  <xsl:value-of select="."/>
                </TD>
              </TR>
            </xsl:if>
          </xsl:template>
        </xsl:stylesheet>