2

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

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

我还检查了 W3Schools 网站对XSLT 属性集的解释,发现:

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);
4

3 回答 3

2

您正在使用非常罕见的“文字结果元素作为样式表”工具,也称为“简化样式表”,其中xsl:stylesheet元素和最外层xsl:template是隐式的。您的问题说明了为什么这个设施很少使用 - 它很快就失去了动力。因为没有xsl:stylesheet元素,所以通常的子级xsl:stylesheet都不能出现,这包括属性集的声明。

更改您的代码以将其包装在显式的xsl:stylesheetandxsl:template match="/"中。然后xsl:attribute-set在与xsl:template.

于 2011-02-23T09:05:11.020 回答
1

以下是在将 XSLT 的开始添加到问题之前编写的。它没有将文字结果元素作为问题的样式表性质来解决。迈克尔凯的回答确实如此。

Anxsl:attribute-set必须是元素的子元素xsl:stylesheet,该元素是 XSLT 的根元素。这与 forxsl:output或相同xsl:template

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

w3schools.com 以多种方式说明了这一点:

  • ELMENT 是顶级元素。
  • 必须是 <xsl:stylesheet> 或 <xsl:transform> 的子级
  • ELEMENT 是顶级元素,必须作为 <xsl:stylesheet> 或 <xsl:transform> 的子节点出现

例子

<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>
于 2011-02-23T07:15:07.240 回答
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="/" 模板规则进行匹配。

参考

于 2014-06-10T02:05:49.303 回答