我有文件grandchild.xml,其结果与granchild.xsl处理后必须转发到child.xsl,那么它必须被最终处理和输出的parent.xsl。
我曾尝试添加xml-stylesheet
元素的结果文档,使用引用的XSL样式表也期待处理,但什么都没有发生。
什么是正确的声明来完成这个任务? 我已经搜索在互联网上有很多,但没有任何结果。
我有文件grandchild.xml,其结果与granchild.xsl处理后必须转发到child.xsl,那么它必须被最终处理和输出的parent.xsl。
我曾尝试添加xml-stylesheet
元素的结果文档,使用引用的XSL样式表也期待处理,但什么都没有发生。
什么是正确的声明来完成这个任务? 我已经搜索在互联网上有很多,但没有任何结果。
除非有人知道更好,我相信处理递归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
。
这里是一个浏览器内的多遍变换的例子 :
让我们有这个源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转换 :
<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>
和
<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。
这是一起胶合这两个转变 :
<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>
说明 :
主样式表模块(一个在XML文档PI标记)导入含有分离的变换两个样式表模块。
第一次转型的结果在variavle捕获$vrtfPass1
。
在XSLT 1.0这样的变量是臭名昭著的“RTF”的(结果树片断)型,不能直接操作(只复制和string()
函数可以在一个RTF使用)。 这里我们使用的便携式变种xxx:node-set()
扩展功能,这两个在IE和其他四大浏览器上运行。 这种便携式扩展最早由@DavidCarlisle提出与原中可以找到他的博客 。
在模式模板“PASS2”然后施加在节点集,这是我们转换,在上面的步骤中,RTF变量。 第二导入的样式表模块中的所有模板在模式“PASS2”,因此它们被选择用于执行。
最后的结果被产生。