2015-02-02 4 views
0

xslt를 사용하여 일부 xml 파일을 변환하고 싶지만 큰 문제가 있습니다.xslt 1.0으로 CDATA 값을 분석하십시오.

내 입력 파일에는 XML 하위 트리가 들어있는 CDATA 태그가 있으며 출력 태그에 복사해야합니다. 다음 CDATA 태그에 대한 정보를 알고 있습니다.

SUBXML1, SUBXML2, SUBXML3 등이 있습니다. 콘텐츠가 고정되어 있습니다. 일부는 SUBXMLn-s에 하나의 요소 (<> a ... </a>) 만 포함하고 일부 요소는 < a> ... </a> < a > < b> ... < b> ... < b> ... </b>)의 여러 요소 및/또는 요소 목록 (< a> </a> </b> .

IBM Message Broker (xsl transform 노드를 사용하여 100 개의 메시지 유형으로 사용하지만 지금까지는이 문제가 없었 음)를 사용하여 변환하려고합니다. 우리는 이러한 변환에 대해 엄격한 규칙을 가지고 있습니다. 우리는 다른 것을 사용할 수 없으며, XLS로 목표를 달성해야합니다. xslt 1.0 만 사용할 수 있습니다 (브로커는 2.0 또는 3.0을 지원하지 않습니다). 우리는 입력/출력 메시지의 구조를 변경할 수 없습니다 (많은 시스템이 정의 된 구조를 사용하므로이를 만질 수 없습니다). 내가 입력 XML 문서가

: 그래서 여기

는 일이

<ns1:myOperation xmlns:ns1="http://mynamespace/"> 
    <SUBXML1> 
     <![CDATA[<metaData><value>value1</value></metaData><metaData><value>value2</value></metaData><notMetaData><notValue>value3</notValue></notMetaData>]]> 
    </SUBXML1> 
</ns1:myOperation> 

를 그리고 난 이런 내 XSL이 있습니다

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns1="http://mynamespace/"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" 
     indent="yes" omit-xml-declaration="yes" /> 

    <xsl:template match="/"> 
     <xsl:apply-templates select="ns1:myOperation" /> 
    </xsl:template> 

    <xsl:template match="ns1:myOperation"> 
     <ns1:myOperation> 
      <xsl:apply-templates select="SUBXML1" /> 
     </ns1:myOperation> 
    </xsl:template> 

    <xsl:template match="SUBXML1"> 
     <xsl:element name="one"> 
      <xsl:element name="metaData"> 
       <xsl:value-of 
        select="substring-before(substring-after(.,'metaData&gt;'), '&lt;/metaData')" disable-output-escaping="yes" /> 
      </xsl:element> 
     </xsl:element> 
     <xsl:element name="all"> 
      <xsl:element name="allSUBXML1"> 
       <xsl:value-of 
        select="." disable-output-escaping="yes" /> 
      </xsl:element> 
     </xsl:element> 
    </xsl:template> 
</xsl:stylesheet> 

이의 출력이 될 것입니다 :

<ns1:myOperation xmlns:ns1="http://mynamespace/"> 
    <one> 
     <metaData> 
      <value>value1</value> 
     </metaData> 
    </one> 
    <all> 
     <allSUBXML1 /> 
    </all> 
</ns1:myOperation> 

참고 : 이 예제를 일식에서 테스트하면 (< allSUBXML1> 비어 있지 않음), select의 xsl : value-of는 select 요소에서만 작동해야합니다! 따라서 메시지 브로커에서는 emfpy < allSUBXML1 /> 요소를 생성하지만, 어떻게 든 이클립스에서 (버그 일 가능성은?) "전체 출력"을 생성하므로 해당 필드에 SUBXML1 내용이 채워집니다. 나의 문제에

: 난 내 입력 XML에 < SUBXML1> ... </SUBXML1 아래에 요소 (만 큰 텍스트)>이 없기 때문에 변환 된 XML에서, < allSUBXML1 /> 노드는 아무런 관련이 없습니다.

내 목표 (SUBXML1에서부터 출력물의 원하는 요소까지 모두 복사)를 어떻게 달성 할 수 있습니까?

SUBXML1에 요소가 없기 때문에 값의 선택을 사용할 수 없으며 큰 문자열 만 사용할 수 있습니다. copy-of를 사용할 수 없습니다. CDATA를 제대로 변환하지 않으면 (출력 결과에 "&lt;"및 "&gt;"이 표시되지 않으려면 유효한 XML 하위 트리 여야 함).

내가 볼 수 있듯이 substring-before(substrin-after(.,...), ...)을 사용하여 SUBXML1에서 하나의 내부 요소를 얻으려고 몇 가지 트릭을 시도했지만 효과가 있지만 충분하지 않습니다.

< SUBXML1>에서 < allSUBXML1> (모든 내부 요소)까지 모든 것을 복사하는 까다로운 방법이 있습니까?

+0

질문을 이해할 수 없습니다. 목표는 "** 모든 것을 ** SUBXML1에서 내 출력의 원하는 요소 *로 복사하는 것입니다."라고 말합니다. pseudo-XML의 일부분 만 추출하는 것과는 달리 * everything *을 복사하려면'disable-output-escaping'을 yes로 설정하고' '를 사용하는 것이 잘못된 것입니다 "? –

+0

제 질문은 : SUBXML1의 내용을 출력의 allSUBXML1에 복사하는 까다로운 방법이 있습니까? disable-output-escaping을 "yes"로 설정하여 을 사용하는 것이 잘못된 이유는 무엇입니까? : 작동하지 않습니다. IMB Message Broker 아래의 xslt 프로세서는 요소를 생성하고 비 웁니다 :''(그러나 Eclipse가 작동 중입니다). 내가 왜 가치를 사용할 수 없는지. 그것은 작동하지 않는다 : ( – amman

+0

XSLT를 사용하는 다른 방법을 모른다. 환경에서 작동하지 않으면 XSLT를 사용하지 않는다. 그러므로 아마도 다른 것을 사용해야 할 것이다. –

답변

0

당신은 XSLT를 사용하여 죽은 세트는 앞으로의

감사합니다, 타마스 있습니까? 이 구문 분석을 ESQL의 비트 스트림 절로 사용하면 쉽게 생각할 수 있습니다.

+0

안녕하세요. 사용하고 싶은 마지막 솔루션입니다. 있습니다. xslt 노드를 호출하고 메시지를 변형하면 (정확하게는 알고 있지만 더 많이 할 수있는) 200 개 이상의 논리가 동일한 논리로 흐른다 : 우리가 이들 중 일부를 수정해야한다면 미래에 유지하는 것이 더 좋다. 그래서 xslt를 사용하고 싶습니다. 일부 불쾌한 재귀 템플릿을 사용하고 subtring (...) 조합을 사용할 필요가 있더라도 사용할 수 있습니다 (하지만 실행 가능하면 어디서든 시작할 수 있습니다). – amman

관련 문제