XSLT抽象

时间:2020-03-06 15:04:55  来源:igfitidea点击:

我正在探索用于生成Web内容的XML-> XSLT-> HTML meme。我几乎没有XSLT经验。

我很好奇XSLT中提供了哪些机制来处理抽象或者"重构"。

例如,在使用通用HTML和服务端包含的情况下,可以对许多页面进行模板化并将其分解为常见的页眉,导航和页脚段,而页面本身基本上就是主体。

通用标记语言(JSP,PHP,ASP)甚至允许所有这些段具有动态内容(例如,将用户名添加到每个标题块中)。

通过允许我们创建Tag文件,JSP可以走得更远。Tag文件可以接受生成内容时要使用的参数,甚至可以包围和处理标签本身中的内容。

我很好奇在XSLT中完成了类似的功能。有什么设施可以使XSLT块可重复使用,以创建HTML页面之类的东西?

解决方案

模板,包括。

Xsl与任何其他编程语言都有很大的不同。 "基于规则。"

我建议我们阅读有关Xslt的内容,然后再询问一些细节。

我们可以使用xsl Include和Import语句来提取页面的一部分。 XSLT本身就是一种可以重现标签文件类型行为的东西。我们可以使用所需的标签来编辑xml数据文件。同时,xsl模板将知道如何处理这些标记,然后它们会遇到它们。

我们可以给模板命名,然后通过" call-template"对其进行调用

在XSLT 2.0中,我们可以创建自己的函数(尽管我发现语法很曲折)

一个值得探索的奇妙领域是使用XSLT生成XSLT样式表。这使我们可以自动化常见的转换方案,其中90%的样式表都是样板。为此,我们需要熟悉'namespace-alias'。这是扩展语言知识的好方法。

对于我自己的项目,这就是我划分页面的方式。有一个template.xsl文件已导入
通过我的每个XSL。大多数页面仅包含template.xsl,但某些页面(例如购物车等)需要自己的页面

<page title="Home">
    <navigation>
        <!-- something here -->
    </navigation>
    <main>
        <!-- something here -->
    </main>
</page>

由于它们正在解析的数据类型不同。

<xsl:template match="/page" name="page">  
    <html>
    <head>  
        <title><xsl:value-of select="(@title)" /></title>           
        <xsl:call-template name="css" />
        <xsl:call-template name="script" />
    </head>
    <body>
        <xsl:call-template name="container" />
    </body>
    </html>
</xsl:template>

这是来自template.xsl的片段。我在这里投入了所有常见的东西,然后给了机会
让我的网页通过call-template添加自己的信息。

<xsl:template name="css">
        <link rel="stylesheet" type="text/css" href="{$cssPath}reset.css"  />
        <link rel="stylesheet" type="text/css" href="{$cssPath}style.css"  />
        <link rel="stylesheet" type="text/css" href="{$cssPath}layout.css" />
        <xsl:call-template name="css-extended" />
    </xsl:template>   

    <!-- This is meant to be blank. It gets overriden by implementing stylesheets -->
    <xsl:template name="css-extended" />

我的css标签如何响应的示例。注意,它只调用css-extended.css。
具有适用于所有页面的通用CSS。一些页面需要更多。那些
可以覆盖css-extended。请注意这是必要的,因为如果出现以下情况,call-template将会失败
页面调用模板,但未在任何地方定义它。

<xsl:template name="container">
        <div id="container">
            <xsl:call-template name="header" />
            <xsl:call-template name="content" />
            <xsl:call-template name="footer" />
        </div>
    </xsl:template>  

    <xsl:template name="content">
        <div id="content">
            <div id="content-inner">
                <xsl:call-template name="sideBar" />
                <xsl:call-template name="main" />
            </div>
        </div>
    </xsl:template>   

    <xsl:template name="main">
        <div id="main">
            <xsl:apply-templates select="main" />
            <xsl:call-template name="main-extended" />
       </div>
    </xsl:template>

    <!-- This is meant to be blank. It gets overriden by implementing stylesheets -->
    <xsl:template name="main-extended" />

<xsl:template name="footer">
        <div id="footer">
        <div id="footer-inner">
        <!-- Footer content here -->
        </div>
        </div>
</xsl:template>

我的容器将以类似的方式工作-定义了常见的内容,然后每个页面
可以提供一个实现。 XSL中有一个默认实现。 (在"内容"中)

它对我来说非常漂亮。如果有任何问题我可以为我们解答,请告诉我。

XSLT功能强大,但是它与大多数编程语言有很大不同,并且它提供给功能非常有限,因此我们使用另一种语言内置的内容可能需要相当复杂的xsl操作才能使用。几周前,当我进行大量XSLT工作时,我发现这里的备忘单很有用。

不要指望XSLT会以特定的方式执行操作,我们可能会找到执行这些操作的好方法,但是如果我们对某些事情应该如何工作有太多的固定想法,很容易陷入困境。

XSL基于模板。

XML数据可以在三个级别上"重用"。在最基本的级别上,我们可以通过XML进行<xsl:for-each />。

注意:XSL中的for-each并没有遍历数据,它只是匹配数据。同样,当"内部" for-each每个内部XML的"上下文"时(就像编程中"作用域"的概念一样)

<xsl:for-each select="/xml/data/here">
    ... do some stuff ...
</xsl:for-each>
<xsl:for-each select="/xml/data/here">
    ... do some DIFFERENT stuff ...
</xsl:for-each>

使用和重用for-each的示例

每个节点都包含在模板节点内(第二级重用)。模板节点有两种类型:匹配和命名。匹配模板节点,就像上面提到的for-each节点一样,但是如果XSL处理开始时匹配任何节点,模板引擎会自动调用它们。匹配模板节点也可以显式应用。另一方面,命名模板节点始终被明确地应用,并且可以被视为类似的函数。

<xsl:template match="/">
    ... do some stuff ...
</xsl:template>

始终将被调用的匹配模板的示例(因为根节点将始终存在)

<xsl:template match="/">
    <xsl:apply-templates select="xml/data/too" />
</xsl:template>

<xsl:template match="xml/data/too">
     ... do something ...
</xsl:template>

匹配模板明确调用另一个匹配模板

注意:为了使Match模板起作用,需要存在与其匹配的XML节点。如果不存在,则不存在匹配项,因此不会调用该模板。

<xsl:template name="WriteOut">
    ... data with NO Context Here ...
</xsl:template>

命名模板的示例

<xsl:template match="/">
   <xsl:call-template name="WriteOut" />
<xsl:template>

或者从匹配模板调用命名模板

注意:我们可以在从中调用匹配的模板和命名的模板的位置进行混合和匹配,只需观察所处的上下文。

所有模板节点都保存在XSL样式表中,我们可以包括和导入各种样式表。例如,我们可以在一个模板中包含所有处理HTML标头节点的模板,而在另一个模板中包含所有处理HTML正文节点的模板。然后,我们可以创建一个包含标题和正文样式表的样式表。

<xsl:include href="header.xsl" />

包含节点的示例

段落数量不匹配