使用Schematron和Perl

时间:2013-07-23 00:59:39

标签: xml perl schematron docbook-5

我正在尝试关注Schematron和Perl上的这篇文章。

http://www.xml.com/pub/a/2002/01/23/perl-schematron.html?page=2

我的目标是使用Schematron和RelaxNG来验证Docbook 5文档。

然而,我似乎无法让这个基本的例子起作用。这是我的Perl脚本,复制自O'Reilly的文章:

#!/usr/bin/perl -w
use strict;
use XML::Schematron::LibXSLT;


my $schema_file = $ARGV[0];
my $xml_file    = $ARGV[1];

die "Usage: perl schematron.pl schemafile XMLfile.\n"
    unless defined $schema_file and defined $xml_file;

my $tron = XML::Schematron::LibXSLT->new();

$tron->schema($schema_file);
my $ret = $tron->verify($xml_file);

print $ret . "\n";

我这样称呼脚本:

perl schematron.pl path-to-docbook.sch path-to-xml-file

我找回了与命名空间“db”有关的错误:

xsltCompileStepPattern : no namespace bound to prefix db
compilation error: file unknown-101d82900 element template
xsltCompilePattern : failed to compile 'db:sidebar'
error
...

我的docbook.sch文件开头如下。它是Docbook 5发行版附带的docbook.sch模式文件:

<?xml version="1.0" encoding="utf-8"?>
<s:schema xmlns:s="http://www.ascc.net/xml/schematron" xmlns:db="http://docbook.org/ns/docbook">
  <s:ns prefix="db" uri="http://docbook.org/ns/docbook"/>
  <s:pattern name="Element exclusion">
    <s:rule context="db:sidebar">

可能是Perl模块使用了不了解命名空间的Schematron版本吗?或者说docbook.sch是不正确的?这很奇怪,因为它附带了Docbook发行版。

我可能会遗漏一些基本的东西,因为我是Schematron的新手。

1 个答案:

答案 0 :(得分:0)

这看起来像XML::Schematron中的错误。 docbook.sch中的以下行未考虑在内:

<s:ns prefix="db" uri="http://docbook.org/ns/docbook"/> 

通过将架构转换为XSLT样式表来完成验证。通过在XSLTProcessor.pm模块中添加DocBook名称空间声明,我能够消除错误:

   
$self->append_template(
       qq|<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
       <xsl:stylesheet $ns version="1.0"
            xmlns:db="http://docbook.org/ns/docbook">   
       <xsl:output method="text"/>
       <xsl:template match="/">
       <xsl:apply-templates select="/" mode="$mode"/>|
   );

以上只是一个黑客攻击。正确的修复(我没有尝试过)当然应该适用于Schematron模式中声明的任何命名空间。