CDATA に少し問題があります。現在のプロジェクトでは、XML 経由でテスト ケース管理システムにインポートするために、多数の HTML 要素を CDATA に変換する必要がありました。私は現在、そのデータをエクスポートして DITA に変換する任務を負っています。以下は、私が作業しているデータからの抜粋であり、十分なコンテキストを提供すると思います。
<tr:testopia><tr:testplan><tr:testcase>
<tr:text version="1">
<tr:author>bugzilla</tr:author>
<tr:action><![CDATA[<ol xmlns="http://www.w3.org/1999/xhtml">
<li>
<p xmlns:xh="http://www.w3.org/1999/xhtml"
xmlns:cln="http://clean/" class="Table">Refer to
<span style="color:red">CHM795_Workflow_DITA_Test_plan.doc
</span>
</p>
</li>
</ol>]]></tr:action>
<tr:expected_result><![CDATA[<ol xmlns="http://www.w3.org/1999/xhtml">
<li>
<p xmlns:xh="http://www.w3.org/1999/xhtml"
xmlns:cln="http://clean/"
class="Table">All requirements are met & example example</p>
</li>
</ol>]]></tr:expected_result>
<tr:setup><![CDATA[]]></tr:setup>
<tr:breakdown><![CDATA[]]></tr:breakdown>
</tr:text>
</tr:testcase></tr:testplan></tr:testopia>
これを行うには、以前に CDATA に保持されていた要素を再度取得する必要があります。少量の調査から、次のような行でこれを達成できることがわかりました。
<xsl:template match="tr:text">
<prerequisites>
<xsl:apply-templates select="tr:setup"/>
</prerequisites>
<postrequisites>
<xsl:apply-templates select="tr:breakdown"/>
</postrequisites>
<process>
<actions>
<xsl:apply-templates select="tr:action"/>
</actions>
<results>
<xsl:apply-templates select="tr:expected_result"/>
</results>
</process>
</xsl:template>
<xsl:template match="text()">
<xsl:value-of select="normalize-space(.)" disable-output-escaping="yes"/>
</xsl:template>
これにより、次のものが提供されます。
<case>
<prerequisites/>
<postrequisites/>
<process>
<actions><ol xmlns="http://www.w3.org/1999/xhtml"> <li> <p xmlns:xh="http://www.w3.org/1999/xhtml" xmlns:cln="http://clean/" class="Table">Perform <span style="color:red">ASM Test Document.docx</span> </p> </li> </ol></actions>
<results><ol xmlns="http://www.w3.org/1999/xhtml"> <li> <p xmlns:xh="http://www.w3.org/1999/xhtml" xmlns:cln="http://clean/" class="Table">Test plan successfully completed</p> </li> </ol></results>
</process>
私が現在直面している問題は次のとおりです。出力エスケープを無効にすると、必要な形式が取得され、翻訳は正常に機能し、DITA ファイルが検証されます。ただし、これらのテスト ケースの一部では、HTML 要素のコンテンツに&
. この段階の後でこれらのケースを最終的な形式に変換しようとすると、SAXON で実行すると次のようなエラーが表示されます。
Error reported by XML parser: The entity name must immediately follow
the '&' in the entity reference.
ノードの内部テキストを現在の「無害な」状態に保ち、CDATA にも保持されているノードにラップする方法はありますか? もっとうまく表現できるかもしれませんが、言葉が頭に浮かびません。