XSLT使用xsl:attribute-set元素简化了样式表

时间:2011-02-23 06:08:43

标签: debugging xslt attributes declaration xml-literals

我正在尝试在我的xsl文档中使用<xsl:attribute-set>,但我不断收到错误消息:

  • 编译错误:第47行元素属性集
  • 元素属性设置仅允许作为样式表的子项

我还检查了W3Schools网站对XSLT attribute-sets的解释,并发现:

Must be child of <xsl:stylesheet> or <xsl:transform>.

我不明白这意味着什么,有人可以解释一下吗?

如果您需要有关我的文件的更多信息,请设置WAMP服务器,请在下面评论。

我的XSL文档的前两行是:

<?xml version="1.0" encoding="UTF-8"?>
<html xsl:version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml">

我不知道他们做了什么,只有没有它,我的XSL将无法正常工作。

我基本上使用这个XSL文件将我的XML转换为HTML。整个过程由PHP完成:

# START XSLT
$xslt = new XSLTProcessor(); 
$XSL = new DOMDocument(); 
$XSL->load('hello.xsl'); 
$xslt->importStylesheet($XSL); 

# LOAD XML FILE 
$XML = new DOMDocument();
$XML->load('hello.xml');

#PRINT 
print $xslt->transformToXML($XML);

3 个答案:

答案 0 :(得分:2)

您正在使用极少见的"literal result element as stylesheet"工具,也称为“简化样式表”,其中xsl:stylesheet元素和最外层xsl:template是隐式的。你的问题说明了为什么这个设施很少使用 - 它很快就会耗尽蒸汽。因为没有xsl:stylesheet元素,所以xsl:stylesheet的常见子元素都不存在,这包括属性集的声明。

更改您的代码,将其包装在明确的xsl:stylesheetxsl:template match="/"中。然后在与xsl:attribute-set相同的级别添加xsl:template

答案 1 :(得分:1)

以下是在XSLT开始添加到问题之前编写的。它没有解决问题的literal result element as stylesheet性质。迈克尔凯的回答确实如此。

xsl:attribute-set必须是xsl:stylesheet元素的子元素,它是XSLT的根元素。这与xsl:outputxsl:template相同。

standard将这些元素描述为“顶级元素”类别。

w3schools.com以多种方式说:

  • ELMENT是顶级元素。
  • 必须是&lt; xsl:stylesheet&gt;的子项或&lt; xsl:transform&gt;
  • ELEMENT是顶级元素,必须显示为&lt; xsl:stylesheet&gt;的子节点。或&lt; xsl:transform&gt;

例如

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output method="xml" indent="yes"/>

    <xsl:attribute-set name="body-attr">
        <xsl:attribute name="color">red</xsl:attribute>
    </xsl:attribute-set>

    <xsl:template match="/">
        <xsl:element name="result" use-attribute-sets="body-attr">
        </xsl:element>
    </xsl:template>

</xsl:stylesheet>

答案 2 :(得分:0)

使用简化语法的另一种方法是将xmlns移出html标记,然后通过document函数内联源文件:

<?xml version="1.0" encoding="UTF-8"?>
 <section
  xsl:version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns=""
 >

    <blockquote>
        <xsl:for-each select="document('movies.xml')//processing-instruction()[contains(., '2014')]">
            <p><xsl:value-of select="concat( local-name(),' ', current() )"/></p>

            <a href="{substring-before(document('movies.xml')//processing-instruction(),',')}">
                <input type="button" value="Stream {local-name()}"/>
            </a>

            <a href="{substring-after(document('movies.xml')//processing-instruction(),',')}">
                <input type="button" value="{local-name()} Soundtrack"/>                    
            </a>

        </xsl:for-each>            
    </blockquote>

 </section>

然后加入:

<stylesheet version="1.0" xmlns="http://www.w3.org/1999/XSL/Transform">
    <include href="simple.xsl"/>
    <attribute-set name="foo"></attribute-set>
    <apply-templates/>
</stylesheet>
  

反过来,这意味着启动转换的唯一有用方法是提供文档节点作为初始匹配选择,使用未命名模式与隐式match =“/”模板规则匹配。

<强>参考