如何使用XSLT转换已转换的XML

内森·美林(Nathan Merrill)

我的XSLT当前具有以下结构:

<xsl:template match="/" xml:space="preserve">
    <html>
        <head>
            <!--stuff here -->
        </head>
        <body>
            <!--stuff here -->
            <xsl:call-template name="page-content" />
            <!--stuff here -->
        </body>
    </html>
</xsl:template>

上面的文件正在由其他XSLT文件导入,这些文件实现了该page-content模板。这是一个示例页面内容模板:

<xsl:template name="page-content">
<div class="main-container">
    <div class="row">
         <xsl:apply-templates select="data/document/content/node()" mode="copy" />
    </div>
</div>
</xsl:template>

我想获取所返回的XML转换后的XML page-content,并将另一个模板与其匹配。(模板将向“ main-container”添加另一个节点)。我正在使用XSLT 3.0

我是否可以两次转换XML,如果可以,我该怎么做?

michael.hor257k

这是一个简单的(非常人为的)示例:

XML格式

<lines>
    <line id="1"/>
    <line id="2"/>
    <line id="3"/>
    <line id="4"/>
    <line id="5"/>
    <line id="6"/>
    <line id="7"/>
    <line id="8"/>
    <line id="9"/>
    <line id="10"/>
    <line id="11"/>
    <line id="12"/>
    <line id="13"/>
    <line id="14"/>
    <line id="15"/>
    <line id="16"/>
    <line id="17"/>
    <line id="18"/>
    <line id="19"/>
    <line id="20"/>
    <line id="21"/>
    <line id="22"/>
    <line id="23"/>
    <line id="24"/>
    <line id="25"/>
</lines>

XSLT 2.0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:template match="/lines">
    <!-- first-pass -->
    <xsl:variable name="pages">
        <xsl:call-template name="paginate">
            <xsl:with-param name="lines" select="line"/>
        </xsl:call-template>
    </xsl:variable>
    <!-- output -->
    <output>
        <xsl:apply-templates select="$pages"/>
    </output>
</xsl:template>

<xsl:template match="page">
    <xsl:copy>
        <xsl:attribute name="number">
            <xsl:number/>
        </xsl:attribute>
        <xsl:copy-of select="line"/>
    </xsl:copy>
</xsl:template>

<xsl:template name="paginate">
    <xsl:param name="lines"/>
    <xsl:param name="pagesize" select="10"/>
    <page>
        <xsl:copy-of select="$lines[position() le $pagesize]"/>
    </page>
    <xsl:if test="count($lines) gt $pagesize">
        <xsl:call-template name="paginate">
            <xsl:with-param name="lines" select="$lines[position() gt $pagesize]"/>
        </xsl:call-template>
    </xsl:if>
</xsl:template>

</xsl:stylesheet>

结果

<?xml version="1.0" encoding="UTF-8"?>
<output>
   <page number="1">
      <line id="1"/>
      <line id="2"/>
      <line id="3"/>
      <line id="4"/>
      <line id="5"/>
      <line id="6"/>
      <line id="7"/>
      <line id="8"/>
      <line id="9"/>
      <line id="10"/>
   </page>
   <page number="2">
      <line id="11"/>
      <line id="12"/>
      <line id="13"/>
      <line id="14"/>
      <line id="15"/>
      <line id="16"/>
      <line id="17"/>
      <line id="18"/>
      <line id="19"/>
      <line id="20"/>
   </page>
   <page number="3">
      <line id="21"/>
      <line id="22"/>
      <line id="23"/>
      <line id="24"/>
      <line id="25"/>
   </page>
</output>

第一遍将线分为10组;第二组将线分为10组。然后第二遍处理组。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章