2013-02-18 1 views
1

내가 가진 I가 "일반"XML 인코딩을 변환 할 HTML 인코딩 된 문자가HTML로 인코딩 된 XML을 변환하는 방법은 무엇입니까?

<values xsi:type="xsd:string">&lt;Test objectgroupNr="001"/&gt;&lt;bezeichnung&gt;A&amp;amp;B &lt;/bezeichnung&gt;</values> 

같은 입력 XML : 내가 함께 일부 문자를 바꿀 수

<values xsi:type="xsd:string"> 
     <Test objectgroupNr="001"/> 
     <bezeichnung>A&amp;B</bezeichnung> 
</values> 

<xsl:character-map name="fischer"> 
      <xsl:output-character character="&lt;" string="&lt;"/> 
      <xsl:output-character character="&gt;" string="&gt;"/> 
</xsl:character-map>  
<xsl:output method="xml" use-character-maps="fischer"/> 

그러나 Ä, Ü, ß, é와 같은 가능한 모든 특수 문자를 입력하는 것은 좋지 않은 것 같습니다.

XSLT를 사용하면 쉽게이 작업을 수행 할 수 있습니까? 변환은 Saxon 8.9를 사용하는 Sonic ESB의 환경에서 이루어집니다.

+0

어떤 버전의 XSLT 2.0 프로세서를 사용합니까? Saxon 9의 상용 버전에는 문자열을 XML로 구문 분석하여이를 사용할 수있는 확장 기능이 있습니다. –

+0

http://www.saxonica.com/documentation/extensions/functions/parse.xml을 참조하십시오. 최신 Saxon 버전에서 구현 된 XSLT 3.0을 사용하면 http://www.saxonica.com/documentation/functions/intro/parse-xml.xml을 사용할 수 있습니다. –

+0

그리고 XPath 3.0에도 데이터에 더 적합한 http://www.w3.org/TR/xpath-functions-30/#func-parse-xml-fragment가 있지만 Saxon이 이미 해당 데이터를 지원하는지 잘 모르겠습니다. 그러나 당신은 물론'values' 요소의 내용을 루트 요소로 감싸고'parse-xml'을 사용하여 해석하고 단순히 루트 래퍼의 자식 노드를 취할 수 있습니다. –

답변

1

http://www.saxonica.com/documentation8.9/extensions/functions/parse.html에 따르면 확장 기능이 지원되므로 예를 들어 다음을 사용할 수 있습니다. 당신은 스타일 시트에 네임 스페이스 선언으로 xmlns:saxon="http://saxon.sf.net/"을 넣어

<xsl:template match="values"> 
    <xsl:copy> 
    <xsl:copy-of select="@*"/> 
    <xsl:copy-of select="saxon:parse(concat('&lt;root&gt;', ., '&lt;/root&gt;'))/*/node()"/> 
    </xsl:copy> 
</xsl:template> 

.

+0

감사합니다 - 그 일을합니다. 그렇지 않으면 일치하는 태그가 제거되므로 ID 변환과 결합해야했습니다. – Jan