Validate XML with Schematron in PHP 5

与世无争的帅哥 提交于 2019-12-06 07:12:36

问题


I have a problem with validating XML with schematron.

In my code I load the XML and XSL as DOMDocument objects and I try to transform:

$domSche = new DOMDocument();
$domSche->loadXML($message);

$domXSLSche = new DOMDocument();
$domXSLSche->load("CI-SIS_StructurationCommuneCDAr2.xsl");

$xsltsche = new XSLTProcessor();
$xsltsche->importStylesheet($domXSLSche);

$XSLValid = $xsltsche->transformToXml($domSche);

But the function returns this error:

XSLTProcessor::transformToXml(): No stylesheet associated to this object

I don't understand, technically, the importStylesheet associates my XSL to the XML, no?

If someone wants to look at more sources, files are at :

  • $message
  • CI-SIS_StructurationCommuneCDAr2.xsl

回答1:


The Schematron version you make use of does not require XSL 2.0 however the file you have makes use of XSL 2.0 features.

XSLTProcessor in PHP supports XSL 1.0 only. Some of the features used in that file are therefore not available and make the import fail.

As the stylesheet could not be imported, the transformation can not run.


The error message

Warning: XSLTProcessor::transformToXml(): No stylesheet associated to this object

means that the stylesheet is missing. Not on disk or in memory, but for the transformation.

That is because it has errors and finally could not compile.

In your case the XSL file you have is of version 2.0 but PHP only supports 1.0 features. Also it makes use of variables that are not set (defined). When I load your example data I get the following errors:

Warning: XSLTProcessor::importStylesheet(): compilation error: file CI-SIS_StructurationCommuneCDAr2.xsl line 13 element stylesheet

Which is:

            version="2.0">

and explained by the next warning:

Warning: XSLTProcessor::importStylesheet(): xsl:version: only 1.0 features are supported

Next is an undefined variable:

Warning: XSLTProcessor::importStylesheet(): Undefined variable

Warning: XSLTProcessor::importStylesheet(): compilation error: file CI-SIS_StructurationCommuneCDAr2.xsl line 4974 element template

which is

    <!--RULE -->
    <xsl:template match="*[cda:templateId/@root = $templateObservationMedia]" priority="1000"
                  mode="M62">

which is the $templateObservationMedia variable and leads to

Warning: XSLTProcessor::importStylesheet(): Failed to compile predicate

To get this working you would need at least fix these problems. As using the variable inside the match pattern is not XSLT 1.0 you need to work around that at least. See Multiple PHP Warnings in XSLTProcessor::importStylesheet() for an extended discussion of the variable/match issue.



来源:https://stackoverflow.com/questions/15064814/validate-xml-with-schematron-in-php-5

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!