2009-10-12 4 views
0

DocBook XSL включает в себя шаблон, который соответствует всем элементуПерекрытие матч = «*» шаблон из DocBook XSL

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

Мне нужно изменить его с другим шаблоном, потому что мой источник XML дерево содержит более, что как раз XML DoocBook. Если я укажу такой шаблон в файле, он переопределит все шаблоны в 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, этот шаблон будет выбран для всех элементов без документов.

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 узлов, возможно, потребуется ограничить набор узлов, на которые Вы претендуете на применяемые-шаблоны части, а также (на основе пространство имен) и, возможно, беспорядок вокруг потока применяемых шаблонов, чтобы обеспечить его предсказуемость. Надеюсь, это вам будет полезно.

+0

Это скорее работа, но я думаю, что это сработает в моем случае; все элементы DocBook объединены, остальные - пользовательские элементы из локального пространства имен. Тем не менее, почему более конкретные шаблоны, импортированные до общего шаблона, не применяются. Общий шаблон, импортированный позже, переопределяет их все. Есть ли способ отменить это поведение? Если я буду делать это с приоритетами, есть ли способ увидеть, какие приоритеты есть во время импорта? –

Смежные вопросы