2017-11-29 5 views
0

기존에 두 줄을 추가하는 방법 :XSLT -이 XML 파일이 XML

..

<!DOCTYPE configuration [ 
    <!ENTITY Reload_POST SYSTEM "Configuration_Reload_POST.xml"> 
]> 
<configuration name="Ibis4Education"> 
    <jmsRealms> 
     <jmsRealm realmName="jdbc" datasourceName="jdbc/${instance.name.lc}"/> 
     <!-- jmsRealm realmName="qcf" queueConnectionFactoryName="jms/qcf"/ --> 
    </jmsRealms> 
    &Reload_POST; 
</configuration> 

내가 다른 <!ENTITY File_Name SYSTEM "file_location.xml"> 다른 &File_Name; 라인을 추가 할을 나는 경험이 아니에요 XSLT를 사용하여 Google에서 좋은 예를 찾을 수 없기 때문에 여기에서 묻습니다.

답변

0

XSLT 데이터 모델은 DTD 및 엔티티 참조를 알지 못하므로 확장명이있는 프로세서를 사용하여 DTD 세부 정보 및 엔티티 참조를 출력하지 않는 한 XSLT가이 작업에 적합하지 않습니다. Saxon 9의 상용 버전이 해당 프로세서를 지원한다는 사실을 알고 있습니다. https://www.saxonica.com/html/documentation/extensions/instructions/doctype.htmlhttps://www.saxonica.com/html/documentation/extensions/instructions/entity-ref.html에서 해당 프로세서에서 지원되는 두 가지 확장 명령을 참조하십시오. 이러한 확장 지침이 주어 지더라도 Andrew Welch가 LexEv (http://andrewjwelch.com/lexev/)를 도구 체인에 추가하지 않는 한 기존 DTD를 처리 할 방법이 있는지 확신하지 못합니다.

일반적으로 이것은 XSLT로 해결할 수있는 작업이 아닙니다. DOM과 같은 다른 XML 트리 조작 방법도 DTD 조작과 관련하여 제한 될 수 있습니다.

0

XML 입력을 유효하게 만들려면 예약 된 XML 문자 & (엔터티 포함)을 바꾸십시오. 예상 출력을 작성하면 더 쉬울 것입니다 :

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 


<xsl:output method="xml"/> 

<xsl:template match="@*|node()"> 
    <xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy> 
</xsl:template> 

<xsl:template match="/"> 
<xsl:text disable-output-escaping="yes"><![CDATA[<!DOCTYPE configuration [ 
<!ENTITY Reload_POST SYSTEM "Configuration_Reload_POST.xml"><!ENTITY File_Name SYSTEM "file_location.xml">]>]]></xsl:text> 
    <xsl:copy><xsl:apply-templates select="node()"/></xsl:copy> 
</xsl:template> 

<xsl:template match="configuration"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*|node()"/> 
    <xsl:text>&amp;File_Name;</xsl:text> 
    </xsl:copy> 
</xsl:template> 
</xsl:stylesheet>