2017-11-10 54 views
6

Tôi đang sử dụng ph-Schematron, thư viện Java mà xác nhận tài liệu XML thông qua ISO Schematron:Giải quyết đường dẫn tương đối khi sử dụng ph-Schematron

Thư viện này cung cấp 2 cách xác nhận tài liệu XML:

  • Validation qua XSLT
  • Validation qua Schematron tinh khiết

tôi rất thích sử dụng loại thứ hai, nhưng file Schematron tôi chứa các chức năng XSLT vì vậy chúng tôi phải sử dụng xác thực bằng XSLT và không phải là thuần túy.

Tôi có một phương pháp xác nhận rằng có hai paramters đầu vào:

  • Các đại diện XSLT của tập tin Schematron
  • Các tài liệu XML để xác nhận

Bây giờ tập tin XSLT của tôi chứa dòng như thế này :

<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" /> 

Và chức năng doc tìm kiếm thư mục c alled 'include' trong thư mục chủ của dự án của tôi thay vì thư mục liên quan đến tài liệu XSLT (mà sẽ logic hơn).

Bây giờ tôi có trường hợp ngoại lệ như:

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) 

Làm thế nào tôi có thể buộc các chức năng doc nhìn vào thư mục bao gồm trong cùng thư mục với file XSLT và không có trong thư mục gốc của dự án Java của tôi?

Trả lời

5

Tôi tìm thấy một giải pháp:

Tôi đã định nghĩa việc triển khai URIResolver của riêng mình, sẽ được sử dụng như một bộ xử lý XSLT bên trong bằng ph-schematron:

class ClasspathResourceURIResolver implements URIResolver { 

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

Điều này sau đó URIResolver được thiết lập để các SchematronResourceXSLT:

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

Tiếp theo chúng ta có thể kiểm tra nếu tập tin Schematron là hợp lệ và kiểm tra tính hợp lệ của một tài liệu XML:

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

Và bây giờ ông quản lý để lấy đường dẫn tương đối trong tệp XSLT.

Hy vọng điều này có thể giúp người khác

Các vấn đề liên quan