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>'), '</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를 제대로 변환하지 않으면 (출력 결과에 "<
"및 ">
"이 표시되지 않으려면 유효한 XML 하위 트리 여야 함).
내가 볼 수 있듯이 substring-before(substrin-after(.,...), ...)
을 사용하여 SUBXML1에서 하나의 내부 요소를 얻으려고 몇 가지 트릭을 시도했지만 효과가 있지만 충분하지 않습니다.
< SUBXML1>에서 < allSUBXML1> (모든 내부 요소)까지 모든 것을 복사하는 까다로운 방법이 있습니까?
질문을 이해할 수 없습니다. 목표는 "** 모든 것을 ** SUBXML1에서 내 출력의 원하는 요소 *로 복사하는 것입니다."라고 말합니다. pseudo-XML의 일부분 만 추출하는 것과는 달리 * everything *을 복사하려면'disable-output-escaping'을 yes로 설정하고' '를 사용하는 것이 잘못된 것입니다 "? –
제 질문은 : SUBXML1의 내용을 출력의 allSUBXML1에 복사하는 까다로운 방법이 있습니까? disable-output-escaping을 "yes"로 설정하여을 사용하는 것이 잘못된 이유는 무엇입니까? : 작동하지 않습니다. IMB Message Broker 아래의 xslt 프로세서는 요소를 생성하고 비 웁니다 :' '(그러나 Eclipse가 작동 중입니다). 내가 왜 가치를 사용할 수 없는지. 그것은 작동하지 않는다 : ( –
amman
XSLT를 사용하는 다른 방법을 모른다. 환경에서 작동하지 않으면 XSLT를 사용하지 않는다. 그러므로 아마도 다른 것을 사용해야 할 것이다. –