2009-06-16 6 views
2

Say У меня есть следующий 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> 

любая дополнительная помощь будет высоко оценена.

+0

@Simon Нанн: Пожалуйста, попробуйте отпустить . Большую часть времени вы захотите на своем месте - ваш XSL будет почти автоматически становиться более структурированным и более понятным в этом смысле. – Tomalak

ответ

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> 
+0

Собственно, это хорошее решение. +1 - Единственная проверка, которую я удаляю, - это «if not (. = '')», - если вы сделаете это, строки будут разбиты. – Tomalak

+0

изменить, приветствия для обнаружения ошибок. –

1

< Просто XSL: Текст > Заголовок </XSL: текст > из-за каждого ...

+0

Да, это сработает для этого примера. Этот вопрос был упрощением реальной проблемы, я создавал таблицу html. В этой проблеме решение, которое вы дали, падает из-за тегов строк таблицы, которые не выстраиваются внутри тегов xsl. Спасибо, простите, извините, я больше не объясню. –

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> 

практически то, что вы хотите, и проще, чем то, что у вас есть сейчас.

+0

Вам нужно выполнить некоторую работу по форматированию пробелов. –

+0

Привет, я думаю, ты показал мне правильное направление. Как вы сказали, мне нужно будет перевернуть форму. Проблема реального мира собирается выводить таблицу html, так что есть вполне подходящий способ. Cheers Simon –

+0

Использование рекомендуется для использования буквальных строк в XSL. Выходное белое пространство намного легче контролируется, а формат кода может поддерживаться независимо от формата вывода. Кроме того, шаблон, который ничего не делает, кроме вызова , лишний. Это происходит в любом случае через заранее определенные шаблоны по умолчанию. – Tomalak

Смежные вопросы