XML 소스 코드 (전체 파일)가 들어있는 WORD로 문서를 작성하고 있습니다. 현재 XML을 임베드하는 방식은 매우 번거롭고 실제로 유지 관리가 가능한 것처럼 보이지 않습니다.
- WORD로 문서 편집을 마치고 Acrobat을 사용하여 문서에서 PDF를 작성합니다.
- 다음으로 IE로 XML 파일 (2x 입력 파일, 2x 생성 출력 파일)을 열고 Acrobat에서 제공하는 PDF 프린터로 인쇄합니다.
- 이제 Acrobat Pro를 열고 4 개의 XML-PDF 파일을 원본 문서에 첨부합니다.
그 작업 흐름의 문제점은 문서를 완성하기에는 너무 많은 수작업이 필요하다는 것입니다.
내가 지금까지 시도한 것은 실제로 나를 만족시키지 않습니다.
- 위에서 설명한 것처럼 각 XML을 PDF로 변환하고 추가
- SCiTE로 XML 파일 열기, RTF로 복사하여 Word에 붙여 넣기
- LaTeX 패키지, 피그먼트 및 리스팅을 가지고 놀았지만 (LaTeX로 문서를 작성할 수도 있음) 이 패키지 각각에서 해결할 수없는 문제 가 있음을 발견했습니다.
문서를 보다 자동으로 생성하는 방법을 찾고 있습니다. 예를 들어 IE 형식화를 포함한 XML 파일 포함 XML이 변경 될 때마다 XML 소스를 수동으로 붙여 넣을 필요가 없도록 파일을 참조로 포함해야합니다.
편집 :
우수한 사용 대답 에 의해 주어진 제레미을 , 내가 좋은 HTML로 지정된 XML 파일을 변환는 XSLT를 설정 마침내 수 있었다. 내 XSLT는 원본 IE 스타일 시트를 기반으로하지만 Word에서 IE 스타일 시트에 필요한 동적 항목을 실행하지 않기 때문에 약간 수정되었습니다.
이와 관련하여 IE XSLT ( here )를 수정하여 더 이상 스크립팅이 필요하지 않습니다 (필자의 경우 절대 필요하지 않음). 설명서 : 스타일 시트는 다음과 같습니다.
<?xml version="1.0"?>
<!--
IE5 default style sheet, provides a view of any XML document
and provides the following features:
- color coding of markup
- color coding of recognized namespaces - xml, xmlns, xsl, dt
This style sheet is available in IE5 in a compact form at the URL
"res://msxml.dll/DEFAULTSS.xsl". This version differs only in the
addition of comments and whitespace for readability.
Author: Jonathan Marsh ()
Modified: 05/21/2001 by Nate Austin ()
Converted to use XSLT rather than WD-xsl
-->
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:dt="urn:schemas-microsoft-com:datatypes" xmlns:d2="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882">
<xsl:strip-space elements="*"/>
<xsl:output method="html"/>
<xsl:template match="/">
<HTML>
<HEAD>
<STYLE>
BODY {font:x-small 'Courier New'; margin-right:1.5em}
<!-- tag -->
.t {color:#990000}
<!-- attribute names -->
.an {color:#990000;}
<!-- tag in xsl namespace -->
.xt {color:#990099}
<!-- attribute in xml or xmlns namespace -->
.ns {color:red}
<!-- attribute in dt namespace -->
.dt {color:green}
<!-- markup characters -->
.m {color:blue}
<!-- text node -->
.tx {font-weight:bold}
<!-- single-line (inline) cdata -->
.di {}
<!-- DOCTYPE declaration -->
.d {color:blue}
<!-- pi -->
.pi {color:blue}
<!-- single-line (inline) comment -->
.ci {color:#888888}
</STYLE>
</HEAD>
<BODY class="st">
<xsl:apply-templates>
<xsl:with-param name="depth">0</xsl:with-param>
</xsl:apply-templates>
</BODY>
</HTML>
</xsl:template>
<!-- decides whether we have a tag in an xsl namespace or a regular tag -->
<xsl:template name="classwriter">
<xsl:param name="curname"/>
<SPAN>
<xsl:attribute name="class"><xsl:if test="starts-with($curname,'xsl:')">x</xsl:if>t</xsl:attribute>
<xsl:value-of select="$curname"/>
</SPAN>
</xsl:template>
<!-- Helper that does the indent -->
<xsl:template name="indent">
<xsl:param name="depth"/>
<xsl:if test="$depth > 0">
<xsl:text>  </xsl:text>
<xsl:call-template name="indent">
<xsl:with-param name="depth" select="$depth - 1"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
<!-- Template for pis not handled elsewhere -->
<xsl:template match="processing-instruction()">
<DIV class="e">
<SPAN class="m"><?</SPAN>
<SPAN class="pi">
<xsl:value-of select="name()"/> <xsl:value-of select="."/>
</SPAN>
<SPAN class="m">?></SPAN>
</DIV>
</xsl:template>
<!-- Template for attributes not handled elsewhere -->
<xsl:template match="@*">
<SPAN class="an"> <xsl:value-of select="name()"/></SPAN><SPAN class="m">="</SPAN><B><xsl:value-of select="."/></B><SPAN class="m">"</SPAN>
</xsl:template>
<!-- Template for text nodes -->
<xsl:template match="text()">
<DIV class="e">
<SPAN class="tx">
<xsl:value-of select="."/>
</SPAN>
</DIV>
</xsl:template>
<!-- Note that in the following templates for comments
and cdata, by default we apply a style appropriate for
single line content (e.g. non-expandable, single line
display). But we also inject the attribute 'id="clean"' and
a script call 'f(clean)'. As the output is read by the
browser, it executes the function immediately. The function
checks to see if the comment or cdata has multi-line data,
in which case it changes the style to a expandable,
multi-line display. Performing this switch in the DHTML
instead of from script in the XSL increases the performance
of the style sheet, especially in the browser's asynchronous
case -->
<!-- Template for comment nodes -->
<xsl:template match="comment()">
<xsl:param name="depth"/>
<DIV class="k">
<SPAN>
<SPAN class="m">
<xsl:call-template name="indent">
<xsl:with-param name="depth" select="$depth"/>
</xsl:call-template>
<!--
</SPAN>
</SPAN>
<SPAN class="ci">
<xsl:value-of select="."/>
</SPAN>
<SPAN class="m">--></SPAN>
</DIV>
</xsl:template>
<!-- Note the following templates for elements may
examine children. This harms to some extent the ability to
process a document asynchronously - we can't process an
element until we have read and examined at least some of its
children. Specifically, the first element child must be
read before any template can be chosen. And any element
that does not have element children must be read completely
before the correct template can be chosen. This seems an
acceptable performance loss in the light of the formatting
possibilities available when examining children. -->
<!-- Template for elements not handled elsewhere (leaf nodes) -->
<xsl:template match="*">
<xsl:param name="depth"/>
<DIV class="e">
<xsl:call-template name="indent">
<xsl:with-param name="depth" select="$depth"/>
</xsl:call-template>
<SPAN class="m"><</SPAN>
<xsl:call-template name="classwriter"><xsl:with-param name="curname" select="name()"/></xsl:call-template>
<xsl:apply-templates select="@*"/>
<SPAN class="m"> /></SPAN>
</DIV>
</xsl:template>
<!-- Template for elements with comment, pi and/or cdata children -->
<xsl:template match="*[comment() | processing-instruction()]">
<xsl:param name="depth"/>
<DIV class="e">
<SPAN class="m"><</SPAN>
<xsl:call-template name="classwriter"><xsl:with-param name="curname" select="name()"/></xsl:call-template>
<xsl:apply-templates select="@*">
<xsl:with-param name="depth" select="$depth + 1"/>
</xsl:apply-templates>
<SPAN class="m">></SPAN>
<DIV>
<xsl:apply-templates>
<xsl:with-param name="depth" select="$depth + 1"/>
</xsl:apply-templates>
<DIV>
<SPAN class="m"></</SPAN>
<xsl:call-template name="classwriter"><xsl:with-param name="curname" select="name()"/></xsl:call-template>
<SPAN class="m">></SPAN>
</DIV>
</DIV>
</DIV>
</xsl:template>
<!-- Template for elements with only text children -->
<xsl:template match="*[text() and not(comment() | processing-instruction())]">
<xsl:param name="depth"/>
<DIV class="e">
<!-- write the starting tag -->
<xsl:call-template name="indent">
<xsl:with-param name="depth" select="$depth"/>
</xsl:call-template>
<SPAN class="m"><</SPAN>
<xsl:call-template name="classwriter"><xsl:with-param name="curname" select="name()"/></xsl:call-template>
<xsl:apply-templates select="@*">
<xsl:with-param name="depth" select="$depth + 1"/>
</xsl:apply-templates>
<SPAN class="m">></SPAN>
<!-- write the tag content -->
<SPAN class="tx">
<xsl:value-of select="."/>
</SPAN>
<!-- write the end tag -->
<SPAN class="m"></</SPAN>
<xsl:call-template name="classwriter"><xsl:with-param name="curname" select="name()"/></xsl:call-template>
<SPAN class="m">></SPAN>
</DIV>
</xsl:template>
<!-- Template for elements with element children -->
<xsl:template match="*[*]">
<xsl:param name="depth"/>
<DIV class="e">
<xsl:call-template name="indent">
<xsl:with-param name="depth" select="$depth"/>
</xsl:call-template>
<SPAN class="m"><</SPAN>
<xsl:call-template name="classwriter"><xsl:with-param name="curname" select="name()"/></xsl:call-template>
<xsl:apply-templates select="@*" />
<SPAN class="m">></SPAN>
<DIV>
<xsl:apply-templates>
<xsl:with-param name="depth" select="$depth + 1"/>
</xsl:apply-templates>
<DIV>
<xsl:call-template name="indent">
<xsl:with-param name="depth" select="$depth"/>
</xsl:call-template>
<SPAN class="m"></</SPAN>
<xsl:call-template name="classwriter"><xsl:with-param name="curname" select="name()"/></xsl:call-template>
<SPAN class="m">></SPAN>
</DIV>
</DIV>
</DIV>
</xsl:template>
<xsl:template match="text()" />
</xsl:stylesheet>