Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么带有名称空间前缀选择器的CSS规则不应用于XSLT输出?_Css_Xml_Xslt_Xhtml_Xml Namespaces - Fatal编程技术网

为什么带有名称空间前缀选择器的CSS规则不应用于XSLT输出?

为什么带有名称空间前缀选择器的CSS规则不应用于XSLT输出?,css,xml,xslt,xhtml,xml-namespaces,Css,Xml,Xslt,Xhtml,Xml Namespaces,我使用名称空间来标识可以从不同用户发送的HTML片段,但Internet Explorer不支持内容类型XHTML+XML,下面向我建议的解决方案是,问题是其选择器具有名称空间前缀的CSS规则被忽略。。。我不知道为什么?我只想说我是XSL新手,所以请一个接一个:) index.php <?php header('Content-type: application/xml'); ?> <?xml version="1.0" encoding="utf-8"?> <?x

我使用名称空间来标识可以从不同用户发送的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>

aa \:p{背景:#00ff00;}
aaa
aaa
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>

这个“问题”与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>

aa \:p{背景:#00ff00;}
aaa

aaa

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

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

{背景:#00ff00;}

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

好的,谢谢,我想我会使用第二个命题,xst,即使我不知道这是什么意思:)它与跨站点跟踪有关系?很抱歉,这听起来不像您知道自己在做什么。css与html不匹配。您必须以某种方式从css中删除名称空间前缀(“在您的示例中为aa/”)。但是我认为这在长时间的therm(对于更复杂的css)上不起作用。我在这个主题上做了很多工作,直到忘记了基础,变得愚蠢,你才唤醒了我:)谢谢……你不需要规则来删除