: Saxon in Java: XSLT for CSV to XML색슨 : XSLT 코드 재사용이 질문에서 내 생각 패턴에 연속으로
그 질문에 당 마이클 케이의 대답은, 내가 결국 문서에 XSLT를 적용하기위한 다음 코드로 결국:
Processor processor = new Processor(false);
StringWriter stringWriter = new StringWriter();
Serializer serializer = new Serializer(stringWriter);
XsltCompiler compiler = processor.newXsltCompiler();
XsltExecutable executable = compiler.compile(new StreamSource(new File(transformLocation)));
XsltTransformer transformer = executable.load();
transformer.setInitialTemplate(new QName("main"));
transformer.setParameter(new QName("filePath"), new XdmAtomicValue("location/of/Test.csv"));
transformer.setDestination(serializer);
transformer.transform();
String transformedDocument = stringWriter.toString().trim();
이 코드는 색슨에서 s9api를 사용합니다 (저는 9.4 HE 버전입니다). 초기 템플릿을 설정하고 변환 할 문서의 경로를 동적으로 삽입 할 수 있으므로 비 XML 파일 (예 : CSV)을 변형 할 수 있습니다.
그러나 이것은 약간의 코드 재사용 가능성을 없애줍니다.
제가 설명 드리겠습니다 : 나는 transformDocument()
방법이 있습니다. 원래 CSV 변환과 같은 미친 작업을 수행하기 전에 XML 만 사용하고 있었기 때문에 marshalObjectToDocument()
및 unmarshalDocumentToObject()
메서드가 호출되었습니다 (재사용 가능성 있음).
unmarshalDocumentToObject()
- 내가 그것의 내부 문서가있는 파일을 시작합니다
여기에만 XML의 세계 주어진 두 방향의 비교입니다.
- 내가 이렇게 :
new StreamSource(new File(documentLocation))
이StreamSource
는 "소스"(XsltTransformer.setSource()
)로transformDocument
에 전달 될 수 - .
- 내가 그것의 내부 문서가있는 파일을 시작합니다
marshalObjectToDocument()
- 나는 어떤 종류의 객체로 시작합니다.
- 이것은 XML의 거대한 문자열로 정렬됩니다.
- 내가 이렇게 :
new StreamSource(new StringReader(giantStringOfXML))
이StreamSource
는 "소스"(XsltTransformer.setSource()
)로transformDocument
에 전달 될 수 - .
은 (unmarshalDocumentToObject()
)의 경우 1 년에 나는 파일 경로가오고, 그래서 난 그냥 파일 경로 문자열을 가지고 있으므로 수동으로 XSLT 매개 변수에 주입 할 수있는 그것을 전달하는 transformDocument()
을 변경할 수 있습니다. 이는 XML과 일반 텍스트 모두에서 작동합니다.
경우 2 (marshalObjectToDocument()
) 파일 경로가 없습니다. XML 표현을 포함하는 거대한 문자열로 변환되는 객체가 있습니다. 파일이 없기 때문에 파일 경로 문자열을 transformDocument()
으로 전달할 수 없습니다. 이제 transformDocument()
을 사용할 수 없습니다. 코드 재사용 가능성이 파괴되었습니다.
내 모든 목표는 XML과 일반 텍스트 문서를 코드에서 동일한 방식으로 처리하고 마샬링 여부에 관계없이 코드를 XSLT와 XSD에 다시 사용할 수있게하는 것입니다 또는 언 마샬링. 이것은 회자 돌파의 목표인가? 필자는 각 문서 유형과 방향에 따라 다른 코드를 작성해야 할 의무가 있습니까? 아니면 누군가이 방법을 볼 수 있습니까?