объединить значение узла, используя логику xslt

Как преобразовать приведенный ниже XML в заданный вывод, используя xslt 1.0 и xslt 2.0. Пожалуйста, обратитесь к данному входу и выходу............... Вход: -

<block>
    <line>
        <formatting>
            <word>text 1</word>
        </formatting>
        <formatting bold="1">
            <word>text 2</word>
        </formatting>
        <formatting bold="1">
            <word>text 3</word>
        </formatting>
        <formatting bold="1">
            <word>text 4</word>
        </formatting>
        <formatting>
            <word>text 5</word>
        </formatting>
        <formatting bold="1">
            <word>text 6</word>
        </formatting>
        <formatting bold="1">
            <word>text 7</word>
        </formatting>
        <formatting>
            <word>text 8</word>
        </formatting>
        <formatting>
            <word>text 9</word>
        </formatting>
        <formatting bold="1">
            <word>text 10</word>
        </formatting>
        <formatting>
            <word>text 11</word>
        </formatting>
    </line>
</block>

Вывод должен быть: -

<p>text 1 <b>text 2 text 3 text 4</b> text 5 <b>text 6 text 7</b> text 8 text 9 <b>text 10</b> text 11</p>

нужен код в xslt 1.0


person LuvKS    schedule 15.07.2014    source источник
comment
Ваш ввод не XML. Вы не можете различать тексты.   -  person Kabulan0lak    schedule 15.07.2014
comment
нужен код в xslt 1.0 Тогда вам не следует ни спрашивать о XSLT 2.0, ни помечать свой вопрос как таковой.   -  person michael.hor257k    schedule 15.07.2014
comment
@ Kabulan0lak Вы вводите не XML. Боюсь, вы сильно ошибаетесь.   -  person michael.hor257k    schedule 15.07.2014
comment
нужен код в xslt 1.0 - Мы даже не говорим "пожалуйста", не так ли? Не то, чтобы слова «пожалуйста» сильно помогли.   -  person Tomalak    schedule 15.07.2014
comment
@ michael.hor257k, лол, ввод был не таким, когда я писал свой комментарий. Это не было xml : text1 text2 text2 ... но теперь это так.   -  person Kabulan0lak    schedule 15.07.2014
comment
@ Kabulan0lak Обычно это вопрос правильного отступа в коде.   -  person michael.hor257k    schedule 15.07.2014


Ответы (1)


С XSLT 2.0 и процессором XSLT 2.0, таким как Saxon 9, вы можете использовать for-each-group group-adjacent:

<xsl:stylesheet 
  version="2.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  exclude-result-prefixes="xs">

<xsl:template match="line">
  <p>
    <xsl:for-each-group select="formatting" group-adjacent="string(@bold)">
      <xsl:if test="position() gt 1"><xsl:text> </xsl:text></xsl:if>
      <xsl:choose>
        <xsl:when test="current-grouping-key() = '1'">
          <b>
            <xsl:value-of select="current-group()/word"/>
          </b>
        </xsl:when>
        <xsl:otherwise>
          <xsl:value-of select="current-group()/word"/>
        </xsl:otherwise>

      </xsl:choose>
    </xsl:for-each-group>
  </p>
</xsl:template>

</xsl:stylesheet>
person Martin Honnen    schedule 15.07.2014
comment
Возможно ли это в xslt 1.0 - person LuvKS; 15.07.2014
comment
Да, но сложнее. Посмотрите родственную рекурсию. Извините, у меня нет времени писать для вас сложный код на XSLT 1.0, когда это можно сделать так легко в 2.0. - person Michael Kay; 15.07.2014
comment
@LuvKS: см. предыдущее замечание Майкла Кея: есть много сообщений о родственной рекурсии и, альтернативно, о группировке по Мюнху. Или задайте новый вопрос (помните, что в этом вопросе вы сказали как xslt 1.0, так и 2.0, поэтому очевидным выбором для этого ответа был вариант 2.0, в котором есть инструкции для каждой группы). - person Abel; 13.08.2014