0

オブジェクトの詳細を XML 形式で持っています

MyObject は、プロパティを持つクラスの名前です。たとえば、objectInformation. これは DB に 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..にはリッチテキストタグが含まれています)したがって、XMLのHTML

このために...以下のいくつかのオプションを試しました:

  1. 使用してみdisable-output-escaping="yes" ましたこれは機能していません...ノードをトラバースできません。XML をエスケープされていない形式で PDF に置くことができます。これは私が望むものではありません。

  2. 試しsaxon.parse()た:これは私に次のようなエラーをスローします:

    SXXP0003: XML パーサーによって報告されたエラー: ファイルの終わりが早すぎる

もしそうなら、これに対する解決策は何ですか?

4

1 に答える 1

1

投稿したスニペットは整形式の XML でさえありません。MyObject開始タグには、>必要な投稿の代わりに so がありません

<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:parseXSLT が拡張機能(または XSLT/XPath 3.0 ) にアクセスできる Saxon 9 の商用バージョンでの処理に関しては、動作するはずですが、要素の属性のparse-xml値を 1 回、2 回使用する必要があります。、次に要素の値でコードが実行するようにします。objectInformationMyObjectnode3

<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 に答える