2009-10-12 43 views
0

的DocBook XSL模板包括匹配所有元素重寫匹配=「*」從DocBook XSL

<xsl:template match="*"> 
    <xsl:message> .... </xsl:message> 
</xsl:template> 

我需要,因爲我的源XML樹包含更多的只是在DoocBook XML與其他模板來覆蓋它的模板。如果我在文件中指定了這樣的模板,它將覆蓋DocBook XSL中的所有模板。似乎所有導入的模板都按照導入順序排列優先級,而不是根據模板的具體情況。

<?xml version='1.0'?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:db="http://docbook.org/ns/docbook" version="1.0"> 

    <xsl:import href="docbook-xsl-ns/xhtml/docbook.xsl" /> 
    <xsl:import href="copy.xsl"/> 

    <xsl:template match="/"> 
    <xsl:apply-templates select="//db:book"/> 
    </xsl:template> 
</xsl:stylesheet> 

copy.xsl

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform> 

    <xsl:template match="*"> 
    <xsl:element name="{local-name()}"> 
     <!-- go process attributes and children --> 
     <xsl:apply-templates select="@*|node()" /> 
    </xsl:element> 
    </xsl:template> 

</xsl:stylesheet> 

示例XML源

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
<http-host>localhost</http-host> 
<book xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:svg="http://www.w3.org/2000/svg" xmlns:m="http://www.w3.org/1998/Math/MathML" xml:id="course.528" xml:lang="en" version="5.0"> 
    <info> 
    <title>Postoperative Complications</title>  
    </info> 
    <chapter xml:id="chapter.1"> 
    <title>INTRODUCTION</title> 
    <para>Postoperative complications are a constant threat to the millions ....</para> 
    </chapter> 
</book> 
<errors></errors> 
</root> 

這對於Xalan和xsltproc的處理器如此。如何覆蓋此模板而無需更改DocBook XSL源代碼。我試圖搞清優先次序,但這並不奏效。

回答

1

從我的理解,你想申請copy.xsl的模板只適用於非docbook元素。嘗試在copy.xsl中更具體 - 通過在copy.xsl中更加具體,將爲所有非docbook元素選擇該模板。

copy.xsl

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform> 

    <xsl:template match="*[not(namespace-uri() = 'http://docbook.org/ns/docbook')]"> 
    <xsl:element name="{local-name()}"> 
     <!-- go process attributes and children --> 
     <xsl:apply-templates select="@*|node()" /> 
    </xsl:element> 
    </xsl:template> 

</xsl:stylesheet> 

根據非Docbook的節點中的DocBook元素的存在,你可能需要限制爲您的應用模板部分應用以及節點集(基於命名空間),並可能圍繞apply-templates流程進行調整,以確保它可以預測地處理它。希望這對你有一些用處..

+0

這是更多的工作,但我認爲這將適用於我的情況; DocBook的所有元素都在一起,其餘都是來自本地命名空間的自定義元素。 但是,爲什麼在通用模板之前導入的更多特定模板未得到應用。稍後導入的常規模板將覆蓋它們全部。有沒有辦法來覆蓋這種行爲?如果我要做到這一點,有沒有辦法看到進口時的優先事項? – 2009-10-15 15:18:25