1

我想知道是否有人可以帮助我解决我遇到的棘手问题。可能在这里问不可能的问题,但有兴趣听到任何建议。

我有一个 XML 文件,其中一个节点包含页面的 HTML。我想获取该节点中的数据以及如何从中创建 HTML 文件。因此,从下面的示例 XML 中,我想转换并cell[2]从中选择节点//dvm/rows/row并将其放置在另一个文件中,以便我可以实际看到 HTML 标记显示的内容并显示为正确的网页而不是代码。

如果我把它和这样的 XSL 放进去,它会起作用吗?

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns="http://www.w3.org/1999/xhtml" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes" method="html"/>
<xsl:template match="/">
    <xsl:value-of select="//dvm/rows/row/cell[2]" disable-output-escaping="yes"/>   
</xsl:template> 
</xsl:stylesheet>

XML 是:

<dvm>
  <description>This is a DVM file</description>
  <columns>
    <column name="lang"/>
    <column name="text"/>
    <column name="code" qualifier="true" order="1"/>
    <column name="type" qualifier="true" order="2"/>
    <column name="subj"/>
    <column name="urem"/>
    <column name="vreq"/>
 </columns>
 <rows>
   <row>
     <cell>English(UK)</cell>
     <cell><![CDATA[<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"       
           "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
           <html xmlns="http://www.w3.org/1999/xhtml">
           <head>
              <title>My HTML File</title>
           </head>
           <body>
           <div class="text">
             <p>This is a line of text</p>
             <p>This is a line of text</p>
             <p>This is a line of text</p>  
           </div>
           </body>
           </html>]]>
     </cell>
     <cell>Code 1</cell>
     <cell>Text</cell>
     <cell>HTML Block 1</cell>
     <cell/>
     <cell/>
   </row>
 </rows>
</dvm>
4

2 回答 2

2

您必须摆脱 CDATA 部分并将其包含的文本用作常规标记。DOCTYPE 也应该被删除(它将由转换生成):

<?xml-stylesheet type="text/xsl" href="delete_3.xsl" ?>
<dvm>
    <description>This is a DVM file</description>
    <columns>
        <column name="lang"/>
        <column name="text"/>
        <column name="code" qualifier="true" order="1"/>
        <column name="type" qualifier="true" order="2"/>
        <column name="subj"/>
        <column name="urem"/>
        <column name="vreq"/>
    </columns>
    <rows>
        <row>
            <cell>English(UK)</cell>
            <cell>
               <html xmlns="http://www.w3.org/1999/xhtml">
               <head>
                  <title>My HTML File</title>
               </head>
               <body>
               <div class="text">
                 <p>This is a line of text</p>
                 <p>This is a line of text</p>
                 <p>This is a line of text</p>
               </div>
               </body>
               </html>
      </cell>
            <cell>Code 1</cell>
            <cell>Text</cell>
            <cell>HTML Block 1</cell>
            <cell/>
            <cell/>
        </row>
    </rows>
</dvm>

然后生成包含在第二个cell元素中的 XHTML 的转换很简单

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN"
 doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/">
     <xsl:copy-of select="/*/rows/*/cell[2]/node()"/>
 </xsl:template>
</xsl:stylesheet>

现在我打开文件时:c:\temp\delete\delete2.xml使用 IE,结果是

<!DOCTYPE html
  PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
   <head>
      <title>My HTML File</title>
   </head>
   <body>
      <div class="text">
         <p>This is a line of text</p>
         <p>This is a line of text</p>
         <p>This is a line of text</p>
      </div>
   </body>
</html>

这由浏览器显示为:

我的 HTML 文件

这是一行文字

这是一行文字

这是一行文字

于 2012-05-03T11:37:44.867 回答
0
<xsl:value-of select="cell[2]" disable-output-escaping="yes" />

请注意,由于您<cell>包含 XHTML,因此实际上不需要 CDATA 部分。XHTML 和 XML 是兼容的,您可以在另一个内部传输一个,而无需先将其转换为字符串。

于 2012-05-03T10:24:07.310 回答