2013-01-11 71 views
1

使用浏览器,我想要将可能包含某些HTML的XML转换为XSL样式表。 在this article,用户Mads Hansen写道:使用替代命名空间在XML内进行XSL转换

如果精心形成你的HTML,那么就嵌入HTML标签不逃逸或CDTATA包装 。如果可能的话,它有助于保持您的内容在XML中。它为您提供更多灵活性来转换和操作文档。 您可以为HTML设置一个名称空间,以便您可以从包装它的其他XML中消除您的HTML标记的歧义。

我喜欢建议的解决方案,但无法使其工作。我用H作为命名空间HTML:

temp.xml

<?xml version='1.0' encoding='UTF-8' ?> 
<?xml-stylesheet type='text/xsl' href='temp.xsl'?> 
<root xmlns:h="http://www.w3.org/1999/xhtml"> 
    <MYTAG title="thisnthat"> 
    text before ol 
    <h:ol> 
     <h:li>item</h:li> 
     <h:li>item</h:li> 
    </h:ol> 
    text after ol 
    </MYTAG> 
</root> 

temp.xsl

<xsl:stylesheet version="1.0" 
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
      xmlns:h="http://www.w3.org/1999/xhtml"> 
    <xsl:output method="html" version="1.0" encoding="UTF-8" indent="yes"/> 
    <xsl:template match="/root"> 
    <html lang="en-US"> 
     <head> 
     <meta charset="UTF-8" /> 
     <title></title> 
     </head> 
     <body> 
     <xsl:apply-templates /> 
     </body> 
    </html> 
    </xsl:template> 
    <xsl:template match="MYTAG"> 
    <h3> 
     <xsl:value-of select="@title" /> 
    </h3> 
    <xsl:apply-templates /> 
    </xsl:template> 
</xsl:stylesheet> 

输出(从Firefox 18)是:

thisnthat 
text before ol item item text after ol 
+0

输出是在浏览器窗口中呈现的还是在转换后的实际HTML中显示的?如果是前者,请显示HTML(使用Firebug)。另外,如果没有标识转换,最后一个'apply-templates'只会写出ol的文本(即不复制节点)。 –

+1

“我喜欢所提出的解决方案,但无法使其工作。”不能做什么工作?预期的结果是什么?请向我们展示原始输出,而不仅仅是它在Firefox中的外观。 – JLRishe

+0

那么,问题是什么?我没看到一个。 –

回答

0

由于你正在生成最终的HTML并且处于控制之中,我不确定你为什么要在这里使用命名空间。只有在自定义标签和标准HTML之间存在冲突时才需要这样做 - 即,如果您的自定义<a...>标签与HTML具有不同的语义。我有你的变换由

一)删除所有HTML命名空间

b)将身份转换

的test.xml

<?xml version='1.0' encoding='UTF-8' ?> 
<?xml-stylesheet type='text/xsl' href='test.xsl'?> 
<root> 
    <MYTAG title="thisnthat"> 
     text before ol 
     <ol> 
      <li>item</li> 
      <li>item</li> 
     </ol> 
     text after ol 
    </MYTAG> 
</root> 

test.xsl

工作
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="html" encoding="UTF-8" indent="yes"/> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="/root"> 
     <html lang="en-US"> 
      <head> 
       <meta charset="UTF-8" /> 
       <title></title> 
      </head> 
      <body> 
       <xsl:apply-templates /> 
      </body> 
     </html> 
    </xsl:template> 
    <xsl:template match="MYTAG"> 
     <h3> 
      <xsl:value-of select="@title" /> 
     </h3> 
     <xsl:apply-templates /> 
    </xsl:template> 
</xsl:stylesheet>