2017-10-19 1 views
0

고마워요.XSLT, CDATA를 CDATA로 표시

적용 코드가있는 텍스트 만 표시하여 .xml 파일을 오류를 쉽게 확인하기 위해 HTML을 생성하는 .xsl 파일을 작성하려고합니다.

XML의 일반 뷰어 응용 프로그램은 XML의 적용 가능성 코드를 기반으로 콘텐츠를 필터링합니다. (적용 코드는 개별 차량 모델을 나타냅니다.) 뷰어 응용 프로그램에서 필터링을 비활성화 할 수있는 방법이 없습니다. 즉, 잠재적으로 누군가가 모든 모델에 대해 올바른지 확인하기 위해 모든 파일을 여러 번 검사해야합니다 (각 적용 코드마다 한 번씩) .

<para>Disconnect main chassis wire harness connector 
MC57 (<xref applicable="UOC_GP0 UOC_HG0 UOC_WC0 UOC_2U0" 
figid="F01"/><xref applicable="UOC_GP1 UOC_HG1 UOC_WC1 
UOC_2U1" figid="F01A"/>, Item 3) from main cab wire 
harness connector MC57 (<xref applicable="UOC_GP0 
UOC_HG0 UOC_WC0 UOC_2U0" figid="F01"/> 
<xref applicable="UOC_GP1 UOC_HG1 UOC_WC1 UOC_2U1" 
figid="F01A"/>, Item 2).</para> 

관련 XSL은 아주 간단합니다 :

내가 그 안에 중첩 된 태그와 XML 데이터를

<xsl:for-each select="para"> 
&#160;&#160;&#160;Step1 Para&#58;&#160;&#160; 
<xsl:value-of select="." /><br /> 
</xsl:for-each> 

하지만 외부 참조 태그를 필터링하고 출력을 잎 :

Step1 Para: Disconnect main chassis wire harness connector 
MC57 (, Item 3) from main cab wire harness connector MC57 (, Item 2). 

출력 내용은 xsl 작성 방법이 맞지만 원하는 내용은 아닙니다.

내가 쓴대로, 외부 참조 태그와 파라 혼합 그들의 속성을 포함하도록 출력을 싶습니다

: 추한이지만, reviwers이 적용과 외부 참조가 있음을 알려 것

Disconnect main chassis wire harness connector 
MC57 (<xref applicable="UOC_GP0 UOC_HG0 UOC_WC0 UOC_2U0" 
figid="F01"/><xref applicable="UOC_GP1 UOC_HG1 UOC_WC1 
UOC_2U1" figid="F01A"/>, Item 3) from main cab wire 
harness connector MC57 (<xref applicable="UOC_GP0 
UOC_HG0 UOC_WC0 UOC_2U0" figid="F01"/> 
<xref applicable="UOC_GP1 UOC_HG1 UOC_WC1 UOC_2U1" 
figid="F01A"/>, Item 2). 

파라.

xsl에서 프로세서가 태그의 내용을 PCDATA가 아닌 CDATA로 처리해야한다는 신호가 있습니까? 그게 확실한 해결책 인 것 같지만, 그렇게 할 방법을 찾지는 못합니다.

또는 다른 방법으로이 문제를 해결할 수 있습니까? para 태그에 xref 태그가 무작위로 임베드되어 있으면 나는 다소 혼란 스럽다.

감사 XML로 표시

+0

그래서 어떤 XSLT 프로세서 버전을 사용합니까? 출력이 HTML이지만 입력에 일부 노드의 XML 마크 업을 표시하려면 직렬화해야합니다. XSLT 3에서 가능합니다 (예 : Saxon 9.8의 오픈 소스에서 지원됨). 'value-of '대신에 를 사용하십시오. –

+0

'xsl : apply-templates'을 실행하고'xref'와 일치 시켜서 직접 직렬화 할 수 있습니다. –

+0

저에게 명백한 해결책은 문자열 값을 출력하는 대신 각 (텍스트 노드 자식 포함)의 모든 자식을 변환하는 것입니다. 이는 지금까지받은 답변 중 하나 일뿐입니다. 물론 이것이 가장 자연스러운 해결책입니다. –

답변

2

당신이, 당신은 다음처럼 작성할 수 있습니다 자신의 XML 구문을 사용하여 모든 외부 참조 요소 요소를 볼 수있게하려면, 다양한 요소에 클래스 속성을 지정 했으므로 표시를 조정할 수 있습니다. (for-each를 과도하게 사용하는 것은 끔찍한 스타일 시트로 이어지는 경향이 있기 때문에 for-each 대신 para 템플릿을 작성했습니다. 원하는 경우 다시 변경하십시오.) Daniel Haley의 의견은 다음과 같습니다. 에 대해 말하다.

<xsl:template match="para"> 
    <xsl:text>&#160;&#160;&#160;Step1 Para&#58;&#160;&#160;</xsl:text> 
    <xsl:apply-templates/> 
    <br/> 
</ 

<xsl:template match="xref"> 
    <span class="xmlsource"> 
    <span class="start-tag"> 
     <xsl:text>&lt;</xsl:text> 
     <xsl:value-of select="name()"/> 
     <xsl:apply-templates select="@*"/> 
     <xsl:text>/&gt;</ 
    </span> 
    </span> 
</ 

<xsl:template match="xref/@*"> 
    <xsl:text> </xsl:text> 
    <xsl:value-of select="name()"/> 
    <xsl:text>="</xsl:text> 
    <xsl:value-of select="string(.)"/> 
    <xsl:text>"</xsl:text> 
</ 

거짓 색 표시

만약 그랬다면, 난 아마보다 직관적 인 디스플레이 볼 선호하는 것 : 그것은을 설정하는 색 배경으로, 해당 figid 값을 표시를 - 또는 가능성이있는 것으로 보이는 경우 figid="F01"은 "여기에 그림 F01 표시"를 의미하므로 그림 자체를 표시하십시오. (나는 후자를 당신을위한 운동으로 남겨 둘 것입니다.)

아래의 코드는 현재 적용 가능성 코드가 전역 변수 $appcodes에 일련의 문자열로 주어져 있다고 가정합니다.

<xsl:template match="xref"> 
    <xsl:if test="tokenize(@applicable) = $appcodes"> 
    <span class="xref-fig"> 
     <xsl:value-of select="@figid"/> 
    </ 
    </ 
</ 

증명 확인하고 볼 수 있습니다 최종 제품의 최종 사용자가 종종 거짓 컬러의 증거라고 일치하는 것은 아니다에 사용되는 디스플레이 이런 종류의

.

관련 문제