xsltxslt-1.0docbookdocbook-5

XSLT did not work with docbook xmlns


I am totally new with xslt and try to make simple XSLT for converting docbook5 to fb2/fb3 and other formats needed for me. But I found problem that I can not understand - if <book> tag has xmlns="http://docbook.org/ns/docbook" xslt did not work. Minimal example of docbook (db.docbook):

<?xml version="1.0" encoding="UTF-8"?>
 <book xml:id="simple_book" version="5.0"
    xml:lang="ru"
    xmlns="http://docbook.org/ns/docbook"
    xmlns:xlink="http://www.w3.org/1999/xlink"
 >
  <info>
   <title>An Example Book</title>
  </info>
 </book>

and XSLT (xsl/example.xsl):

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

<xsl:template match="/">
  <tag><xsl:value-of select="/book/info/title"/></tag>
</xsl:template>

</xsl:stylesheet>

I try xsltproc

xsltproc xsl/example.xsl db.docbook

and saxon

saxon-xslt db.docbook xsl/example.xsl

in Debian GNU/Linux 9.1, but got

<?xml version="1.0"?>
<tag/>

if I remove xmlns in docbook:

<?xml version="1.0" encoding="UTF-8"?>
 <book xml:id="simple_book" version="5.0"
    xml:lang="ru"
    xmlns:xlink="http://www.w3.org/1999/xlink"
 >
  <info>
   <title>An Example Book</title>
  </info>
 </book>

both processors make right output:

<?xml version="1.0"?>
<tag>An Example Book</tag>

May be somebody know how make xslt without removing xlmns?


Solution

  • You have to declare the namespace in your XSLT and use it:

    <xsl:stylesheet version="1.0" 
                    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                    xmlns:db="http://docbook.org/ns/docbook">
    
      <xsl:template match="/">
        <tag><xsl:value-of select="/db:book/db:info/db:title"/></tag>
      </xsl:template>
    
    </xsl:stylesheet>