2011-06-25 53 views
4

我想创建一个XSL样式表,它允许合并从另一个XHTML文件引用的XHTML文件。反过来,从引用文件引用的任何XHTML文件也应该被合并,依此类推。因此,应该可以将所有直接或间接通过起始XHTML文件引用的XHTML递归合并到一个XHTML文件中。参考文献是严格等级的。使用XSLT递归合并XHTML文件到一个XHTML文件

实施例:

文件a.html:

<html> 
    <body>Text1<br/><a href="b.html">Link</a></body> 
</html> 

文件b.html:

<html> 
    <body>Text2<br/><a href="c.html">Link</a></body> 
</html> 

文件c.html:

<html> 
    <body>Text3<br/></body> 
</html> 

结果合并文件时从a.html开始:

<html> 
    <body>Text1<br/>Text2<br/>Text3<br/></body> 
</html> 

我不知道如何用XSLT解决这个问题。任何帮助表示赞赏。

+0

+1 - 一个很好的问题,很好的简短例子。 –

+0

好问题,+1。 –

回答

0

这可能会有点棘手,但请检查document()函数。

我见过的表演如何,包括你的输出另一个文档的例子,但我没有看到,它可以让你开始相同的调用过程中转化该文件的任何实例。但我也没有自己尝试过。

如果不能解决问题,document()可以让您将转换递归到其他文档中,您可以在循环中调用转换,并编写要重复调用的转换。那么你需要一些方法来检查什么时候可以停止转换。

知道何时应该停止的一种方法是在源文档和目标文档之间进行区分。

另一种方法是将元素放置在文档的顶部(如果找到任何子文档),并在找不到时将其删除。然后检查这个元素的存在。

但也许有一种方法可以继续通过包含的子文档进行转换。

3

赞Merlyn Morgan-Graham说,关键是document()函数。这不是棘手虽然...

这个样式表:

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

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

    <xsl:template match="a"> 
    <xsl:apply-templates select="document(@href)/html/body/node()"/> 
    </xsl:template> 

</xsl:stylesheet> 

与3个HTML文件,并使用a.html作为输入,结果在这个输出:

<html> 
    <body>Text1<br/>Text2<br/>Text3<br/> 
    </body> 
</html> 

而且,真正使这成为可能是身份转换。它传递任何不与另一个模板不匹配的东西。

0

这种转变

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

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

<xsl:template match="a"> 
    <xsl:apply-templates select= 
    "document(@href)/*/body/node()"/> 
</xsl:template> 
</xsl:stylesheet> 

当文件 “a.html” 适用于:

<html> 
    <body>Text1<br/><a href="b.html">Link</a></body> 
</html> 

产生想要的,正确的结果

<html><body>Text1<br/>Text2<br/>Text3<br/></body></html> 

说明

  1. 身份规则副本的每个节点 “原样”。

  2. 唯一的重写模板匹配任何a元素。

  3. 在此模板中,启动a元素的href属性中指向的文档处理。我们必须使用标准的XSLT功能document()