0

我有 XML 格式的对象的详细信息

MyObject 是具有属性的类的名称,可以说:objectInformation。这以 XML 格式存储在 DB 中。当我从数据库中提取读取时 - 我得到以下输出。

<MyObject objectInformation="&lt;node1>&lt;node2>some Information here&lt;/node2>&lt;node3>&lt;![CDATA[&lt;TEXTFORMAT LEADING=&quot;2&quot;>&lt;P ALIGN=&quot;LEFT&quot;>&lt;FONT FACE=&quot;Verdana&quot; SIZE=&quot;11&quot; COLOR=&quot;#403F3F&quot; LETTERSPACING=&quot;0&quot; KERNING=&quot;0&quot;>&lt;B>&lt;I>comment in for new object&lt;/I>&lt;/B>&lt;/FONT>&lt;/P>&lt;/TEXTFORMAT>]]>&lt;/node3>&lt;node4>07/18/2013&lt;/node4>&lt;/node1>"</MyObject>

这我需要...:

  1. 通过 XSL 解析。
  2. 读取每个节点的内容。
  3. 以 PDF 格式渲染它们(注意:上面的 node3 .. 里面有富文本标签)所以 HTML 格式的 XML

为此...我尝试了以下几个选项:

  1. 尝试使用disable-output-escaping="yes" 这不起作用...我无法遍历节点。我可以将未转义格式的 XML 放到 PDF 中。这不是我想要的。

  2. 试过saxon.parse():这给我一个错误说:

    SXXP0003:XML 解析器报告的错误:文件过早结束

有没有人遇到过这样的挑战,如果是这样,解决方案是什么。

4

1 回答 1

1

您发布的片段甚至不是格式正确的 XML,MyObject开始标签缺少一个>所以而不是您发布的内容

<MyObject objectInformation="&lt;node1>&lt;node2>some Information here&lt;/node2>&lt;node3>&lt;![CDATA[&lt;TEXTFORMAT LEADING=&quot;2&quot;>&lt;P ALIGN=&quot;LEFT&quot;>&lt;FONT FACE=&quot;Verdana&quot; SIZE=&quot;11&quot; COLOR=&quot;#403F3F&quot; LETTERSPACING=&quot;0&quot; KERNING=&quot;0&quot;>&lt;B>&lt;I>comment in for new object&lt;/I>&lt;/B>&lt;/FONT>&lt;/P>&lt;/TEXTFORMAT>]]>&lt;/node3>&lt;node4>07/18/2013&lt;/node4>&lt;/node1>"></MyObject>

至于使用 Saxon 9 的商业版本进行处理,其中 XSLT 可以访问扩展功能saxon:parse(或 XSLT/XPath 3.0 parse-xml),我认为它应该可以工作,但您需要使用它两次,一次是元素objectInformation属性的值MyObject,然后是node3元素的值,所以代码会做例如

<xsl:template match="MyObject">
  <xsl:apply-templates select="saxon:parse(@objectInformation)/node()"/>
</xsl:template>

<xsl:template match="node3">
  <xsl:apply-templates select="saxon:parse(.)/node()"/>
</xsl:template>

<xsl:template match="TEXTFORMAT">
  <!-- now create or transform the elements as needed -->
</xsl:template>

给你一个更完整的例子,当我应用样式表时

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:fo="http://www.w3.org/1999/XSL/Format"
  xmlns:saxon="http://saxon.sf.net/"
  exclude-result-prefixes="saxon"
  version="2.0">

<xsl:output method="xml" indent="yes"/>

<xsl:template match="MyObject">
  <xsl:apply-templates select="saxon:parse(@objectInformation)/node()"/>
</xsl:template>

<xsl:template match="node3">
  <xsl:apply-templates select="saxon:parse(.)/node()"/>
</xsl:template>

<xsl:template match="TEXTFORMAT">
  <fo:block>
    <xsl:apply-templates/>
  </fo:block>
</xsl:template>

<xsl:template match="P">
  <fo:block>
    <xsl:apply-templates/>
  </fo:block>
</xsl:template>

</xsl:stylesheet>

到输入

<MyObject objectInformation="&lt;node1>&lt;node2>some Information here&lt;/node2>&lt;node3>&lt;![CDATA[&lt;TEXTFORMAT LEADING=&quot;2&quot;>&lt;P ALIGN=&quot;LEFT&quot;>&lt;FONT FACE=&quot;Verdana&quot; SIZE=&quot;11&quot; COLOR=&quot;#403F3F&quot; LETTERSPACING=&quot;0&quot; KERNING=&quot;0&quot;>&lt;B>&lt;I>comment in for new object&lt;/I>&lt;/B>&lt;/FONT>&lt;/P>&lt;/TEXTFORMAT>]]>&lt;/node3>&lt;node4>07/18/2013&lt;/node4>&lt;/node1>"></MyObject>

使用 Saxon 9.1.0.8(支持 Saxon 9 的最新开源版本saxon:parse)我得到了结果

<?xml version="1.0" encoding="UTF-8"?>some Information here<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format">
   <fo:block>comment in for new object</fo:block>
</fo:block>07/18/2013

我意识到这不是一个完整且有效的 XSL-FO 文档,但它显示了在输入中转义然后通过解析的元素的模板saxon:parse被调用。因此,您只需添加更多模板即可根据需要转换其他元素并创建有效的 XSL-FO 文档,如果您需要帮助,我建议您提出一个新问题,概述输入元素所需的 FO 结构。已被解析(即您希望如何转换这些node元素以及如何转换那些 HTML 元素),那么希望比我更熟悉 XSL-FO 的人可以提供帮助。

于 2013-07-22T11:22:46.823 回答