Шаблон переопределения = "*" из DocBook XSL - PullRequest
0 голосов
/ 12 октября 2009

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 Ответ

1 голос
/ 14 октября 2009

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

...