繁体   English   中英

XSL使用备用名称空间在XML内部转换HTML

[英]XSL transform HTML inside XML using alternate namespace

对于浏览器,我想使用XSL样式表转换可能包含一些HTML的XML。 用户Mads Hansen本文中写道:

如果您的HTML格式正确,则只需嵌入HTML标签,而无需在CDTATA中转义或包装。 如果有可能,将内容保留为XML是有帮助的。 它为您提供了更大的灵活性来转换和处理文档。 您可以为HTML设置一个名称空间,以便可以将HTML标记与其他XML包装在一起。

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

临时文件

<?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>

临时文件

<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 

由于您正在生成最终的HTML并处于控制之中,因此我不确定为什么要在此处使用名称空间。 仅当自定义标签和标准HTML之间存在冲突时才需要执行此操作,即,如果您的自定义<a...> ...>标签的语义与HTML有所不同。 我得到了您的转变以

a)删除所有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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM