2012-06-08 62 views
0

我正在使用XSL-FO和FOP來生成PDF。我正在將複雜的HTML頁面轉換爲PDF。執行XML/XSLT轉換需要一些幫助

我遇到了以下錯誤:

未知格式化對象 「{} BR」 遭遇(p的孩子)。 (沒有上下文可用)

FOP處理器不理解我提供的XSL-FO的格式,因爲它裏面還有一些HTML標籤。我想過濾的XML <p><br/>標籤鏈接如下:

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

在最後一位,在「標籤要素1」和「Tab元素2」,你可以看到<p><br/>是FOP不明白。

你能幫我用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來代替我的源XML的<p><br>標籤?

回答

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

對於那些有興趣的,這是我用來代替<br><p>標籤的XSL。你需要的xmlns:FO =「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

嗯,我認爲這有效,但實際上在應用此XSLT時缺少很多源XML。接受xsl:copy元素上的select屬性... – Julius