2012-06-08 2 views
0

Я использую XSL-FO и FOP для создания PDF-файлов. Я в процессе преобразования сложной HTML-страницы в PDF.Нужна помощь в преобразовании XML/XSLT

я побежал в следующую ошибку:

объекта Unknown форматирование "{} уш" встречается (ребенок р). (Нет контекста)

Процессор FOP не понимает формат XSL-FO, который я предоставляю, поскольку в нем все еще есть теги HTML. Я хотел бы, чтобы фильтровать <p> и <br/> теги в XML, связанных ниже:

http://www.tekstenuitleg.net/xmlinput.xml

В последние биты, под «Tab элемента 1» и «Tab элемент 2» вы можете увидеть <p> и <br/>, что ФОП не понимает.

Не могли бы вы помочь мне отфильтровать их с помощью XSLT и заменить их на <fo:block>some replacement here</fo:block>? Я пробовал несколько разных таблиц стилей XSLT, но они не совсем работают. Я вернул XSLT к тому, что у меня было в самом начале. Ниже XSLT не терпит неудачу, но не делает никаких преобразований.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" encoding="utf-8" indent="no"/> 
    <xsl:template match="/"> 
     <xsl:copy-of select="*"/> 
    </xsl:template> 
</xsl:stylesheet> 

Что я должен добавить к этому XSLT заменить <p> и <br> тегов в моем исходном XML?

ответ

0

Вам нужен шаблон для каждого элемента:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" encoding="utf-8" indent="no"/> 
    <xsl:template match="p"> 
     <xsl:copy-of select="*" /> 
    </xsl:template> 
    <xsl:template match="br"> 
     <!-- --> 
    </xsl:template> 
</xsl:stylesheet> 
1

я предполагаю, вы имеете в виду вы хотите, чтобы удалить физические тег P/BR, но сохранить их содержимое.

В этом случае, обратитесь к этой XMLPlayground сессии (см XML в источнике вывода)

http://www.xmlplayground.com/9OE0NI

Шаблон итерации делает один из двух вещей:

  • если текущий узел является P/BR, выводить только его содержимое, а не тег
  • в противном случае вывести теги и их содержимое

... затем рекурсия для дочерних узлов.

+0

Спасибо за пример, который я решил эту проблему. добавив пространство имен xsl-fo в файл xslt и изменив свой пример на мои нужды. – Julius

0

Для тех, кого это интересует, это XSL, который я использую для замены тегов <br> и <p>. Вам нужны Xmlns: Ф.О. = "http://www.w3.org/1999/XSL/Format есть вы хотите вывести XSLFO как <fo:block>

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format"> 
<xsl:output omit-xml-declaration="yes" indent="yes" /> 

<xsl:template match="/"> 
    <xsl:apply-templates select='*' /> 
</xsl:template> 

<xsl:template match='*'> 
    <xsl:choose> 
     <xsl:when test='name() = "p"'> 
      <fo:block> 
       <xsl:value-of select='.' /> 
      </fo:block> 
     </xsl:when> 
     <xsl:when test='name() = "br"'> 
      <fo:block></fo:block> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:copy select='.' /> 
     </xsl:otherwise> 
    </xsl:choose> 
    <xsl:apply-templates select='*' /> 
</xsl:template> 

+0

Хм, я думал, что это сработало, но на самом деле я пропускаю много исходного XML при применении этого XSLT. И трансформатор не принять атрибут select в элементе xsl: copy ... – Julius

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