1

使用浏览器,我想使用 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 
4

1 回答 1

0

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

a) 删除所有 HTML 命名空间

b) 添加恒等变换

测试.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>

测试.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>
于 2013-01-11T01:00:40.123 回答