【问题标题】:Why are CSS rules with namespace-prefixed selectors not being applied to XSLT output?为什么没有将带有命名空间前缀选择器的 CSS 规则应用于 XSLT 输出?
【发布时间】:2013-06-27 15:18:13
【问题描述】:

我使用命名空间来识别可以从不同用户发送的 HTML 片段,但是 Internet Explorer 不支持内容类型 XHTML+XML,向我建议以下解决方案,问题是 CSS 规则的选择器有名称空间前缀被忽略...我不知道为什么?只是我想提一下,我是 XSL 的新手,所以请一一说:)

index.php

<?php header('Content-type: application/xml'); ?>
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="xslt.xsl"?>

<html xmlns:xsl="http://www.w3.org/TR/WD-xsl" 
      xmlns="http://www.w3.org/1999/xhtml" 
      xmlns:aa="zz" 
      xmlns:ee="rr">
<head>
    <title></title>
    <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
    <style type="text/css">
        aa\:p{background: #00ff00;}
    </style>
</head>
<body>
    <aa:p>aaa</aa:p>
    <ee:p>aaa</ee:p>
</body>
</html>

xslt.xsl

<xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
              doctype-system=" http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"/>

    <xsl:template match="*">
      <xsl:element name="{local-name()}">
        <xsl:apply-templates select="@* | node()"/>
      </xsl:element>
    </xsl:template>

    <xsl:template match="@* | comment() | text() | processing-instruction()">
      <xsl:copy/>
    </xsl:template>

    <xsl:template match="processing-instruction('xml-stylesheet')" />

</xsl:stylesheet>

【问题讨论】:

  • 您不需要规则来删除&lt;?xml-stylesheet PI。它不会传递到 XSLT 处理器中。

标签: css xml xslt xhtml xml-namespaces


【解决方案1】:

这个“问题”与 xslt 无关(首先是租用的)。如果 css 没有按照您的预期进行,则必须考虑 html(由您的 xslt 生成)。 因为您要删除任何命名空间前缀,所以生成的 hmtl 中没有 manespaces 前缀。

 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" " http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
    <head>
        <title></title>
        <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8">
        <style type="text/css">
            aa\:p{background: #00ff00;}
        </style>
    </head>
    <body>
        <p>aaa</p>
        <p>aaa</p>
    </body>
</html>

但是从 xslt 的角度来看,css 内容只是文本。因此,将输入 XML 中的 &lt;style&gt; 更改为:

 <style type="text/css">
       p{background: #00ff00;}
    </style>

或者您必须使用 xst 进行文本处理(xslt-1.0 稍微复杂一些)。

【讨论】:

  • 好的,谢谢,我想我会使用第二个命题,XST,即使我不知道那是什么意思 :) 它与跨站点跟踪有关系吗?
  • 抱歉,这听起来并不像您完全知道自己在做什么。您的 css 与您的 html 不匹配。您必须以某种方式从 css 中删除名称空间前缀(在您的示例中为“aa/”)。但我认为这在长期热(对于更复杂的 css)上效果不佳。
  • 我在这个话题上做了很多工作,直到忘记了基础知识,变得愚蠢,你刚刚唤醒了我 :) 谢谢...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多