Показать заголовок только один раз для каждого - PullRequest
2 голосов
/ 16 июня 2009

Скажите, у меня есть следующий 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>

недействительно, кто-нибудь может порекомендовать краткое и удобочитаемое решение? и, возможно, хорошая книга для изучения функционального мышления:)

Приветствия

Simon

------------------------------ приложение ---------------- ----------

Обдумав ответы, которые мне представили, я понял, что потерял некоторые ключевые компоненты проблемы, которую пытался решить.

мои данные больше похожи на:

<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 ]

5 голосов
/ 16 июня 2009
<?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 голос
/ 16 июня 2009

Конечный результат был больше похож на:

        <?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> 
1 голос
/ 16 июня 2009

Просто возьмите Header </ xsl: text> для каждого ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...