Преобразование XML с помощью XSL и самозакрывающихся тегов

#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. Я исправил опечатку.