2012-05-23 1 views
0

: 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() 메서드가 호출되었습니다 (재사용 가능성 있음).

  1. unmarshalDocumentToObject()
    • 내가 그것의 내부 문서가있는 파일을 시작합니다

      여기에만 XML의 세계 주어진 두 방향의 비교입니다.

    • 내가 이렇게 : new StreamSource(new File(documentLocation))StreamSource는 "소스"(XsltTransformer.setSource())로 transformDocument에 전달 될 수
    • .
  2. marshalObjectToDocument()
    • 나는 어떤 종류의 객체로 시작합니다.
    • 이것은 XML의 거대한 문자열로 정렬됩니다.
    • 내가 이렇게 : new StreamSource(new StringReader(giantStringOfXML))StreamSource는 "소스"(XsltTransformer.setSource())로 transformDocument에 전달 될 수
    • .

은 (unmarshalDocumentToObject())의 경우 1 년에 나는 파일 경로가오고, 그래서 난 그냥 파일 경로 문자열을 가지고 있으므로 수동으로 XSLT 매개 변수에 주입 할 수있는 그것을 전달하는 transformDocument()을 변경할 수 있습니다. 이는 XML과 일반 텍스트 모두에서 작동합니다.

경우 2 (marshalObjectToDocument()) 파일 경로가 없습니다. XML 표현을 포함하는 거대한 문자열로 변환되는 객체가 있습니다. 파일이 없기 때문에 파일 경로 문자열을 transformDocument()으로 전달할 수 없습니다. 이제 transformDocument()을 사용할 수 없습니다. 코드 재사용 가능성이 파괴되었습니다.

내 모든 목표는 XML과 일반 텍스트 문서를 코드에서 동일한 방식으로 처리하고 마샬링 여부에 관계없이 코드를 XSLT와 XSD에 다시 사용할 수있게하는 것입니다 또는 언 마샬링. 이것은 회자 돌파의 목표인가? 필자는 각 문서 유형과 방향에 따라 다른 코드를 작성해야 할 의무가 있습니까? 아니면 누군가이 방법을 볼 수 있습니까?

답변

1

확실히 이것은 소프트웨어 엔지니어링의 표준 및 기본 비트입니까?여기에 3 비트의 코드가 있습니다 : 변환을 실행하려는 응용 프로그램. XSLT 엔진 및 변환을 수행하는 XSLT 엔진과 XSLT 엔진이 제공하는 서비스에 대한 추상화를 제공하는 인터페이스 계층으로, 일반적으로 응용 프로그램에 필요한 기능만을 제공하고 간단한 형식으로 제공합니다. 인터페이스 계층의 장점은 변환 API의 복잡성을 줄이는 것입니다. 단점은 기능을 감소시키는 것입니다. 응용 프로그램이 이전에 숨겨진 기능을 더 많이 원할 때 인터페이스 계층에 기능을 추가하거나 (결국 값을 추가하지 않는 지점에 도달 할 수 있음) 여러 가지 옵션을 사용할 수 있습니다. 애플리케이션에서 가치가없는 부분.

코드 재사용은 여러 곳에서 사용할 수있는 기능의 덩어리를 식별하는 데 달려 있습니다. 응용 프로그램의 다른 비트가 다른 일을하는 경우 코드를 다시 사용하는 것이 어려워집니다. 새로운 것은 무엇입니까?