2017-11-10 14 views
6

का उपयोग कर रहा पीएच-स्कीमेट्रोन, एक जावा पुस्तकालय है कि आईएसओ स्कीमेट्रोन के माध्यम से एक्सएमएल दस्तावेजों की पुष्टि करता है उपयोग कर रहा हूँ:संबंधित पथ का समाधान किया जब पीएच-स्कीमेट्रोन

  • :

    इस पुस्तकालय XML दस्तावेज सत्यापन के 2 तरीके प्रदान करता है शुद्ध स्कीमेट्रोन के माध्यम से XSLT

  • मान्यता के माध्यम से मान्यता

मैं दूसरे प्रकार का उपयोग करना अच्छा लगेगा, लेकिन इतना उपयोग हम चाहिए मेरी स्कीमेट्रोन फ़ाइलों XSLT कार्य शामिल एक्सएसएलटी का उपयोग करके सत्यापन और शुद्ध नहीं।

  • स्कीमेट्रोन फ़ाइल के XSLT प्रतिनिधित्व
  • XML दस्तावेज मान्य करने के लिए

अब मेरी XSLT फ़ाइल इस तरह लाइनों में शामिल हैं:

मैं एक सत्यापन विधि दो इनपुट पैरामीटर है कि है :

<xsl:when test="count(hl7:confidentialityCode[concat(@code,@codeSystem)=doc('include/voc-1.3.6.1.4.1.12559.11.10.1.3.1.42.31-DYNAMIC.xml')//valueSet[1]/conceptList/concept/concat(@code,@codeSystem) or @nullFlavor])>=1" /> 

और दस्तावेज़ फ़ंक्शन फ़ोल्डर फ़ोल्डर की तलाश करता है एक्सएसएलटी दस्तावेज के सापेक्ष फ़ोल्डर की बजाय मेरी परियोजना की होम निर्देशिका में 'शामिल' शामिल है (जो अधिक तर्कसंगत होगा)।

java.io.FileNotFoundException: C:\LocalData\Development\projectname\include\voc-1.3.6.1.4.1.12559.11.10.1.3.1.42.31-DYNAMIC.xml (The system cannot find the path specified) 
at java.io.FileInputStream.open0(Native Method) 
at java.io.FileInputStream.open(FileInputStream.java:195) 
at java.io.FileInputStream.<init>(FileInputStream.java:138) 
at java.io.FileInputStream.<init>(FileInputStream.java:93) 
at sun.net.www.protocol.file.FileURLConnection.connect(FileURLConnection.java:90) 
at sun.net.www.protocol.file.FileURLConnection.getInputStream(FileURLConnection.java:188) 
at org.apache.xerces.impl.XMLEntityManager.setupCurrentEntity(Unknown Source) 
at org.apache.xerces.impl.XMLVersionDetector.determineDocVersion(Unknown Source) 
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source) 
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source) 
at org.apache.xerces.parsers.XMLParser.parse(Unknown Source) 
at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source) 
at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source) 
at net.sf.saxon.event.Sender.sendSAXSource(Sender.java:451) 
at net.sf.saxon.event.Sender.send(Sender.java:153) 
at net.sf.saxon.functions.DocumentFn.makeDoc(DocumentFn.java:330) 
at net.sf.saxon.functions.Doc.call(Doc.java:138) 
at net.sf.saxon.functions.Doc.call(Doc.java:24) 
at net.sf.saxon.expr.FunctionCall.iterate(FunctionCall.java:546) 
at net.sf.saxon.expr.Expression.evaluateItem(Expression.java:773) 
at net.sf.saxon.expr.SimpleStepExpression.iterate(SimpleStepExpression.java:108) 
at net.sf.saxon.expr.SlashExpression.iterate(SlashExpression.java:868) 
at net.sf.saxon.expr.SlashExpression.iterate(SlashExpression.java:868) 
at net.sf.saxon.expr.SlashExpression.iterate(SlashExpression.java:868) 
at net.sf.saxon.expr.SlashExpression.iterate(SlashExpression.java:868) 
at net.sf.saxon.value.MemoClosure.iterate(MemoClosure.java:109) 
at net.sf.saxon.expr.VariableReference.iterate(VariableReference.java:482) 
at net.sf.saxon.expr.GeneralComparison.effectiveBooleanValue(GeneralComparison.java:621) 
at net.sf.saxon.expr.OrExpression.effectiveBooleanValue(OrExpression.java:131) 
at net.sf.saxon.expr.FilterIterator$NonNumeric.matches(FilterIterator.java:198) 
at net.sf.saxon.expr.FilterIterator.getNextMatchingItem(FilterIterator.java:81) 
at net.sf.saxon.expr.FilterIterator.next(FilterIterator.java:64) 
at net.sf.saxon.functions.Exists$1.effectiveBooleanValue(Exists.java:67) 
at net.sf.saxon.expr.instruct.Choose.choose(Choose.java:865) 
at net.sf.saxon.expr.instruct.Choose.processLeavingTail(Choose.java:840) 
at net.sf.saxon.expr.instruct.Block.processLeavingTail(Block.java:653) 
at net.sf.saxon.expr.instruct.TemplateRule.applyLeavingTail(TemplateRule.java:353) 
at net.sf.saxon.trans.Mode.applyTemplates(Mode.java:456) 
at net.sf.saxon.trans.TextOnlyCopyRuleSet.process(TextOnlyCopyRuleSet.java:65) 
at net.sf.saxon.trans.Mode.applyTemplates(Mode.java:433) 
at net.sf.saxon.expr.instruct.ApplyTemplates.apply(ApplyTemplates.java:298) 
at net.sf.saxon.expr.instruct.ApplyTemplates.processLeavingTail(ApplyTemplates.java:255) 
at net.sf.saxon.expr.instruct.Block.processLeavingTail(Block.java:653) 
at net.sf.saxon.expr.instruct.Instruction.process(Instruction.java:149) 
at net.sf.saxon.expr.instruct.ElementCreator.processLeavingTail(ElementCreator.java:364) 
at net.sf.saxon.expr.instruct.ElementCreator.processLeavingTail(ElementCreator.java:311) 
at net.sf.saxon.expr.instruct.TemplateRule.applyLeavingTail(TemplateRule.java:353) 
at net.sf.saxon.trans.Mode.applyTemplates(Mode.java:456) 
at net.sf.saxon.Controller.transformDocument(Controller.java:2321) 
at net.sf.saxon.Controller.transform(Controller.java:1892) 
at net.sf.saxon.s9api.XsltTransformer.transform(XsltTransformer.java:579) 
at net.sf.saxon.jaxp.TransformerImpl.transform(TransformerImpl.java:185) 
at com.helger.schematron.xslt.AbstractSchematronXSLTBasedResource.applySchematronValidation(AbstractSchematronXSLTBasedResource.java:273) 
at com.helger.schematron.xslt.AbstractSchematronXSLTBasedResource.applySchematronValidationToSVRL(AbstractSchematronXSLTBasedResource.java:288) 
at com.helger.schematron.xslt.AbstractSchematronXSLTBasedResource.getSchematronValidity(AbstractSchematronXSLTBasedResource.java:197) 
at com.helger.schematron.AbstractSchematronResource.getSchematronValidity(AbstractSchematronResource.java:210) 
at epsos.ccd.posam.tm.util.NewSchematronValidator.doValidate(NewSchematronValidator.java:47) 
at epsos.ccd.posam.tm.util.NewSchematronValidator.validate(NewSchematronValidator.java:39) 
at epsos.ccd.posam.tm.util.SchematronValidatorTest.testValidationNew(SchematronValidatorTest.java:28) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:498) 
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) 
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) 
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) 
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) 
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
at org.junit.runner.JUnitCore.run(JUnitCore.java:137) 
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68) 
at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:51) 
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:237) 
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70) 

मैं कैसे XSLT फ़ाइल के रूप में और मेरे जावा परियोजना के रूट में नहीं एक ही निर्देशिका में शामिल फ़ोल्डर को देखने के लिए डॉक समारोह के लिए मजबूर कर सकते हैं:

अब मैं जैसे अपवाद मिल गया?

उत्तर

5

मैं एक समाधान मिला:

class ClasspathResourceURIResolver implements URIResolver { 

    @Override 
    public Source resolve(String href, String base) throws TransformerException { 
     return new StreamSource(this.getClass().getClassLoader().getResourceAsStream(href)); 
}  

इस: मैं एक URIResolver के अपने खुद के कार्यान्वयन, कि आंतरिक रूप से पीएच-स्कीमेट्रोन द्वारा एक XSLT प्रोसेसर के रूप में इस्तेमाल किया जाएगा परिभाषित

IReadableResource readableResource = new ReadableResourceInputStream(new FileInputStream(schematronFile)); 
SchematronResourceXSLT schematronResourceXslt = new SchematronResourceXSLT(readableResource); 
schematronResourceXslt.setURIResolver(new ClasspathResourceURIResolver()); 

अगला हम देख सकते हैं कि स्कीमेट्रोन फ़ाइल मान्य है और एक XML दस्तावेज की वैधता की जांच:

if (!schematronResourceXslt.isValidSchematron()) 
     throw new IllegalArgumentException ("Invalid Schematron!"); 
final StreamSource xmlSource = new StreamSource(xmlFile); 
final EValidity schematronValidity = schematronResourceXslt.getSchematronValidity(xmlSource); 

और अब वह संबंधित पथ को पुनः प्राप्त करने में सफल हुआ URIResolver तो SchematronResourceXSLT पर सेट है एक्सएसएलटी फ़ाइल में।

आशा है कि यह किसी और की मदद कर सकता है

2

ऐसा लगता है इस पीएच-स्कीमेट्रोन पुस्तकालय के लिए एक खुला मुद्दा है जब एक xslt funcion प्रयोग किया जाता है, तो के लिए कोई समाधान अब मैं = लगता है (

https://github.com/phax/ph-schematron/issues/60

संबंधित मुद्दे