#xml #xslt
#xml #xslt
Вопрос:
У меня есть следующий XML
<run>
<font style="bold"/>Some Wording
</run>
Я хочу преобразовать его в
<p>
<b>Some Wording</b>
</p>
Я пытаюсь использовать этот шаблон
<xsl:template match="run/font[@style='bold']">
<p>
<b>
<xsl:value-of select="."/>
</b>
</p>
</xsl:template>
но это дает результат
<p>
<b/>Some Wording
</p>
Как мне перенести формулировку в <b>
теги с помощью XSLT?
Комментарии:
1. Результат правильный. У
<font>
тега нет содержимого, как, следовательно, и у вашего<b>
тега. ТекстSome wording
не является дочерним по отношению к<font>
тегу, поэтому нет причин выделять его жирным шрифтом.2. Да, я понимаю, что это правильно, как написано, но это не то, что я хочу создать. Формулировка является дочерней по отношению к
<run>
тегу, но я хочу применять<b>
теги только тогда, когда формулировке предшествует<font style="bold">
тег.3. Не вижу, что вы можете это сделать. Ваш входной файл странный. Вы должны обтекать свой текст жирным шрифтом.
4. Можете ли вы выполнить проверку if, чтобы увидеть, соответствует ли родственник вашему желанию, и если да, то включить в выбранный тег?
5. Итак, если это правильно, почему вы хотите это изменить? Проблема здесь во входных данных, а не в преобразовании. И если вам нужно это изменить, каков основополагающий принцип? Каждый родной брат такого
<font>
элемента? Каждый пост-брат? Каждый брат / сестра и их дочерние элементы? Только текстовые элементы? Вам нужно правильно охарактеризовать вашу проблему… и как только это будет сделано, выразить это в XSLT будет тривиально.
Ответ №1:
Если вам требуется обернуть любой текстовый узел, которому непосредственно предшествует <font style="bold"/>
в <b>
элементе, вы можете достичь этого с помощью
<xsl:template match="text()[preceding-sibling::*[1][self::font][@style='bold']]">
<b><xsl:value-of select="."/></b>
</xsl:template>
Если это не ваше требование (вывод требований из одного примера, как известно, подвержен ошибкам), тогда вам нужно объяснить это более четко.
Комментарии:
1. Спасибо Майклу. Это сделало свое дело. Мне просто нужно было завершить
<b>
, и это сработало.2. Я исправил опечатку.