使用XSL为具有多个XInclude的XML设置样式

时间:2014-10-20 12:01:16

标签: xml xslt xinclude

我正在尝试设置一个XML文档的样式,该文档使用xinclude包含其他xml文件以用于模块化目的。 我正在使用Firefox作为我的工具来可视化转换。 (所有文件都在同一个文件夹中) 目前我已经编写了以下xsl:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                          xmlns:xi="http://www.w3.org/2001/XInclude"
                          exclude-result-prefixes='xsl xi'>
    <xsl:template match="/interfaces">
        <html>
            <head>
                <meta charset="UTF-8" content="text/html" http-equiv="Content-Type"/>
                <title>Messages</title>
            </head>
            <body>
                <xsl:apply-templates select="message"/>
            </body>
        </html>
    </xsl:template>

    <xsl:template match="message">
        <xsl:value-of select="@name"/><br/>
        <xsl:apply-templates select="xi:include[@href][@parse='xml' or not(@parse)]" />
    </xsl:template>

    <xsl:template match="xi:include">
        Should be outputed...<xsl:apply-templates select="document(@href)" />
    </xsl:template>

</xsl:stylesheet

要处理以下xml:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type='text/xsl' href='messages-xsl.xml'?>

<interfaces>
    <message name="some_message">
        <xi:include href="some_message.xml" xmlns:xi="http://www.w3.org/2003/XInclude"/>
    </message>
</interfaces>

我知道stackoverflow上的一些帖子提出了类似的问题,但到目前为止我无法解决问题。 提前谢谢。

1 个答案:

答案 0 :(得分:1)

您的XSLT有xmlns:xi="http://www.w3.org/2001/XInclude",但您的示例有xmlns:xi="http://www.w3.org/2003/XInclude",您需要在XSLT和XML中使用相同的命名空间。为了获得更好的错误消息,我建议在XSLT中使用version="1.0",因为Firefox使用的是XSLT 1.0处理器,并且切换为使用您的version =“2.0”属性转发兼容处理。