XSLT - 删除CDATA而不禁用输出转义

时间:2013-07-08 14:31:26

标签: xslt-2.0 cdata

CDATA有点问题。对于我当前的项目,我必须将许多HTML元素转换为CDATA,以便通过XML导入到测试用例管理系统。我现在的任务是导出数据并将其转换为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中保存的节点中?可能会说得更好,但这些话不会浮现在脑海中。

0 个答案:

没有答案