Как добавить пробел при обнаружении определенного шаблона? - PullRequest
1 голос
/ 25 мая 2010

У меня серьезная проблема с поиском способа добавить пробел между двумя дочерними элементами.

<aaa>
    I want to add <bbb>a</bbb><ccc>space</ccc> between two words.
</aaa>

Я хочу добавить пробел между словами "a" и "пробел", если элемент ccc следует сразу за элементом bbb. В настоящее время я применяю шаблон на уровне элементов aaa, а затем обрабатываю элементы bbb и ccc в отдельных шаблонах.

Я понятия не имею, как заранее обнаружить этот </bbb><ccc> паттерн.

Примечание: я не знаю, какие слова будут внутри элементов bbb и ccc.

1 Ответ

2 голосов
/ 25 мая 2010

Это преобразование :

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

 <xsl:template match="node()|@*" name="identity">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match=
   "b[. = 'a'
   and
    following-sibling::node()
                    [1]
                    [self::i
                   and
                     . = 'boy'
                    ]
      ]
   ">
   <xsl:call-template name="identity"/>
   <xsl:text> </xsl:text>
 </xsl:template>
</xsl:stylesheet>

при выполнении с предоставленным XML-документом :

<aaa>
    I am <b>a</b><i>boy</i>.
</aaa>

дает желаемый, правильный результат :

<aaa>
    I am <b>a</b> <i>boy</i>.
</aaa>

Примечание :

  1. Использование правила идентификации для копирования всех узлов.

  2. Переопределение правила идентификации с определенным шаблоном для выполнения добавления пробела точно между указанными <b> и <i> узлами.

  3. Шаблон соответствия (выражение XPath), используемый для точного соответствия искомому узлу <b>, после которого необходимо вставить пробел.

  4. Повторное использование кода правила шаблона, как применяемого, так и вызываемого по имени.

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