html - 如何处理 XSLT 中嵌入的 XML 标记?

标签 html xml xslt formatting

我正在使用 XSLT 将 XML 转换为 HTML。我无法弄清楚如何处理嵌入的 XML 节点以进行格式化。例如,假设我有 XML 元素:

<favoriteMovie>the <i>Star Wars</i> saga</favoriteMovie>

但是,在 XLST 期间,<i>标签被忽略,因此“星球大战”在 HTML 输出中没有斜体。有没有相对简单的方法来解决这个问题?

test.xml:

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="test.html.xsl"?>
<favoriteMovies>
    <favoriteMovie>the <i>Star Wars</i> saga</favoriteMovie>
</favoriteMovies>

test.html.xsl:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" omit-xml-declaration="yes" />
    <xsl:template match="/">
      <html>
        <head />
          <body>
            <ul>
                <xsl:for-each select="favoriteMovies/favoriteMovie">
                    <li><xsl:value-of select="." /></li>
                </xsl:for-each>
            </ul>
          </body>
      </html>
    </xsl:template>
</xsl:stylesheet>

最佳答案

However, during XLST, the <i> tag gets ignored, so "Star Wars" is not italicized in the HTML output. Is there a relatively simple way to fix this?

你的问题就在这里:

<ul>
  <xsl:for-each select="favoriteMovies/favoriteMovie">
    <li><xsl:value-of select="."/></li>
  </xsl:for-each>
</ul>

<xsl:value-of> 指令用于创建文本节点。这样做时,它会将 select 中指定的 XPath 表达式的字符串值复制到输出。此 XSLT 指令的属性。元素的字符串值是其所有文本节点后代的串联。

这就是您获得报告输出的方式。

解决方案:

使用 <xsl:copy-of> 指令,复制其select中指定的所有节点属性:

<ul>
  <xsl:for-each select="favoriteMovies/favoriteMovie">
    <li><xsl:copy-of select="node()"/></li>
  </xsl:for-each>
</ul>

另一个更符合 XSLT 原则的解决方案避免使用 <xsl:for-each>完全没有:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/">
  <html>
    <head />
    <body>
     <xsl:apply-templates/>
    </body>
  </html>
 </xsl:template>

 <xsl:template match="/*">
  <ul>
   <xsl:apply-templates/>
  </ul>
 </xsl:template>

 <xsl:template match="favoriteMovie">
  <li><xsl:copy-of select="node()"/></li>
 </xsl:template>
</xsl:stylesheet>

将上述两种解决方案中的任何一种应用于提供的 XML 文档时:

<favoriteMovies>
    <favoriteMovie>the 
        <i>Star Wars</i> saga
    </favoriteMovie>
</favoriteMovies>

产生想要的正确结果:

<html>
    <head/>
    <body>
        <ul>
            <li>the 
                <i>Star Wars</i> saga
            </li>
        </ul>
    </body>
</html>

关于html - 如何处理 XSLT 中嵌入的 XML 标记?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4707571/

相关文章:

Php 表单未向我的数据库添加数据

javascript - 使用标题和标题文本折叠面板

c# - 将 XML 反序列化为扩展集合的类

.net - 从 XSLT 输出根中删除 XML 命名空间声明?

javascript - 使用 css/javascript 定位背景图像

javascript - 在表中转移号码

java - 如何将“&”符号放入 Word 2007 .docx XML 文件中?

java - 使用 Android 应用程序调用 Textview 值

xslt - 循环不同的值

xml - 需要帮助 - 使用 XSLT 根据条件添加/替换/删除 XML 中的节点