做一个XSLT结果文档由“父” XSLT文档进行处理,递归(Make an XSLT result

2019-09-21 04:34发布

我有文件grandchild.xml,其结果与granchild.xsl处理后必须转发到child.xsl,那么它必须被最终处理和输出的parent.xsl。

我曾尝试添加xml-stylesheet元素的结果文档,使用引用的XSL样式表也期待处理,但什么都没有发生。

什么是正确的声明来完成这个任务? 我已经搜索在互联网上有很多,但没有任何结果。

Answer 1:

除非有人知道更好,我相信处理递归XSLT输出上的浏览器是不可能的能力。

为了证明这一点,我刚才想在IE8,FF14和Chrome以下...

level1.xml

<?xml version="1.0" encoding="utf-8" ?> 
<?xml-stylesheet title="XSL_formatting" type="text/xsl" href="level1.xsl"?>
<data>
  <id>Level 1 data</id>
</data>

level1.xsl

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:template match="/">
     <?xml-stylesheet title="XSL_formatting" type="text/xsl" href="level2.xsl"?>
     <data2>
       <id2>Level 2: <xsl:value-of select="/data/id"/></id2>
     </data2>
   </xsl:template>   
</xsl:stylesheet>

level2.xsl

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:template match="/">
     <html>
       <body>
         <b>Level 3:</b> <xsl:value-of select="/data2/id2"/>
       </body>
     </html>
   </xsl:template>   
</xsl:stylesheet>

所有3个浏览器的结果是简单地显示Level 2: Level 1 Data



Answer 2:

这里是一个浏览器内的多遍变换的例子

让我们有这个源XML文档

<?xml-stylesheet title="XSL_formatting"
  type="text/xsl" href="MultiPassBrowser.xsl"?>
<nums>
  <num>01</num>
  <num>02</num>
  <num>03</num>
  <num>04</num>
  <num>05</num>
  <num>06</num>
  <num>07</num>
  <num>08</num>
  <num>09</num>
  <num>10</num>
</nums>

让我们这两个XSLT转换

MultiPassBrowser1.xsl

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="num/text()">
  <xsl:value-of select=". *2"/>
 </xsl:template>
</xsl:stylesheet>

MultiPassBrowser2.xsl

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="node()|@*" mode="pass2">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*" mode="pass2"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="num" mode="pass2">
  <p><xsl:value-of select=". +1"/></p>
 </xsl:template>
</xsl:stylesheet>

第一变换复制XML文档“原样”,但与每的字符串值num元件乘以2。

第二变换复制XML文档“原样”,但与每的字符串值num递增元件。

如果第二转换在第一的结果施加时,最终值,从最初得到的num元素必须是3,5,7,...,21。

这是一起胶合这两个转变

MultiPassBrowser.xsl

<xsl:stylesheet version="1.0" 
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:ext="http://exslt.org/common"
 xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
 exclude-result-prefixes="ext msxsl">
 <xsl:import href="file:///C:/Temp/delete/MultiPassBrowser1.xsl"/>
 <xsl:import href="file:///C:/Temp/delete/MultiPassBrowser2.xsl"/>
 <xsl:output method="html"/>
 <xsl:strip-space elements="*"/>

 <msxsl:script language="JScript" implements-prefix="ext">
     this['node-set'] =  function (x) {
      return x;
      }
 </msxsl:script>

 <xsl:template match="/">
  <html>
      <xsl:variable name="vrtfPass1">
        <xsl:apply-templates select="/*"/>
      </xsl:variable>

      <xsl:apply-templates select="ext:node-set($vrtfPass1)/*/*"
                           mode="pass2"/>
  </html>
 </xsl:template>
</xsl:stylesheet>

结果,XML文件被打开时与两个IE,火狐,Safari和Opera,是正确的,预期之一

<html>
   <p>3</p>
   <p>5</p>
   <p>7</p>
   <p>9</p>
   <p>11</p>
   <p>13</p>
   <p>15</p>
   <p>17</p>
   <p>19</p>
   <p>21</p>
</html>

说明

  1. 主样式表模块(一个在XML文档PI标记)导入含有分离的变换两个样式表模块。

  2. 第一次转型的结果在variavle捕获$vrtfPass1

  3. 在XSLT 1.0这样的变量是臭名昭著的“RTF”的(结果树片断)型,不能直接操作(只复制和string()函数可以在一个RTF使用)。 这里我们使用的便携式变种xxx:node-set()扩展功能,这两个在IE和其他四大浏览器上运行。 这种便携式扩展最早由@DavidCarlisle提出与原中可以找到他的博客

  4. 在模式模板“PASS2”然后施加在节点集,这是我们转换,在上面的步骤中,RTF变量。 第二导入的样式表模块中的所有模板在模式“PASS2”,因此它们被选择用于执行。

  5. 最后的结果被产生。



文章来源: Make an XSLT result document be processed by a “parent” XSLT document, recursively
标签: xml xslt