2011-05-11 3 views
3

나는 내 질문이이 질문에 대해 정의를 나타내기를 바랍니다. 다음 XML 블록과 XSL 샘플 블록을 고려하십시오. XSL 변환을위한 XML 텍스트 형식


<xsl:template match="level_one"> 
<xsl:value-of select="text()"/> 
<br/> 
<xsl:apply-templates select="level_two"/> 
</xsl:template> 

<xsl:template match="level_two"> 
<xsl:value-of select="text()"/> 
<br/> 
</xsl:template> 

약자로

<root> 
<level_one> 
My first line of text on level_one 
<level_two> 
My only line of text on level_two 
</level_two> 
My second line of text on level_one 
</level_one> 
</root> 

는 (판독 여기 변성) 출력 상기 실행 I가 level_one 텍스트의 두번째 라인 누락

My first line of text on level_one 
<br/> 
My only line of text on level_two 
<br/> 

이다. 그래서 두 가지가 궁금합니다.

  1. XML이 유효합니까? 내가 아는 바로는 응답자는 그렇습니다. 그러나 나는 틀린가?
  2. 두 번째 줄 (또는 여기에 나와있는 것보다 훨씬 많은 줄)을 얻기 위해 XSL을 어떻게 수정할 수 있습니까?

감사

+1

텍스트 사이에 하위 태그를 배치하는 것이 좋은 XML 스타일이 아니라고 생각합니다. – martin

+0

좋은 질문, +1. 이 문제의 이유에 대한 설명과 쉽고 자연스러운 해결책에 대한 내 대답을 참조하십시오. –

답변

0

은 XML이 유효합니까? 내가 아는 바로는 대답은 예이지만 내가 잘못한 것입니까?

예 XML이 유효합니다. 또한 위의 설명과는 달리 XML에서 혼합 된 내용 (텍스트와 요소가 혼합되어 있음)을 갖는 데는 아무런 문제가 없습니다. 그것은 모두 컨텍스트와 XML 사용 방법에 따라 다릅니다. 예를 들어 혼합 된 내용이없는 기술 설명서를 작성하는 것은 거의 불가능합니다. (좋은 예는 단락 요소에 텍스트와 혼합 참조 요소입니다.)

내가 두 번째 줄을 얻을 수 (또는 I 표시된 것보다 내 경우에는 더 선) 하기 위해 XSL을 수정하는 방법 ?

난 당신이 달성하기 위해 노력하고 정확히 모르겠지만, 당신이 첫 번째 <xsl:value-of select="text()"/>에 첫 선을 일치하고 있기 때문에 텍스트의 두 번째 줄 표시되지 않는 이유입니다. 일치이 XML 데이터의 전체 세트 작업,하지만 당신은 하나의 템플릿으로 모두 level_onelevel_two 템플릿을 대체 할 수 있는지 잘 모르겠어요

모든 text() :

<xsl:template match="text()"> 
    <xsl:value-of select="."/> 
    <br/> 
    </xsl:template> 

이 다음과 같은 출력을 생성 :

012 :

My first line of text on level_one 
    <br/> 
    My only line of text on level_two 
    <br/> 
    My second line of text on level_one 
    <br/> 

또한 level_one 및 level_two 부모를 지정하여 아래로 경기를 좁힐 수

동일한 출력을 생성하지만 다른 템플리트에서 일치시키기 위해 다른 텍스트를 열어 둡니다.

희망이 도움이됩니다.

+0

예, 많은 도움이되었습니다. 일반 text() 템플릿을 사용하지 않으므로 구조 및 출력을보다 잘 제어 할 수있었습니다. 나는 일반 텍스트() 템플릿을 사용하여 끝났지 만 부모를 확인하기위한 규정을 넣어서 내가 필요한 곳에 만 적용되도록했습니다. – james

+0

반갑습니다. 좋은 질문에 +1 +1 –

1

xsl : apply-templates를 사용하는 재귀 적 디센트의 표준 XSLT 처리 모델을 사용하십시오.

<xsl:template match="*"> 
    <xsl:apply-templates/> 
</xsl:template> 

<xsl:template match="text()"> 
<xsl:value-of select="."/> 
<br/> 
</xsl:template> 

<xsl:value-of select="text()"/>은 나쁜 소식입니다. XSLT 1.0에서는 처음 발견 한 텍스트 노드 만 표시합니다. XSLT 2.0에서는 모든 자식 텍스트 노드를 공백으로 구분하여 표시하지만 두 번째 전에 첫 번째와 세 번째 문장을 출력하기 때문에 원하는 내용이 아닐 수도 있습니다. (실제로 당신은 내가 생각하는 데 너무 정확하게 원하는 출력 말했다하지 않았습니다.)

1

에도 text() 일치하는 템플릿없이, 당신은 출력 하여 현재 노드 (level_one)의 두 text() 노드 아이들이 교체 할 수 있습니다 :

<xsl:value-of select="text()"/> 

:

는 XSLT 1.0에서는 매우 IMP이다
<xsl:copy-of select="text()"/> 

<xsl:value-of select="$someNodeSet"/>$someNodeSet 노드 집합의 첫 번째 노드 (문서 순서대로)의 문자열 값을 생성한다는 것을 알고 있어야합니다. 다른 측면에

:

<xsl:copy-of select="$someNodeSet"/> 

사본을 모든 노드가 $someNodeSet에 포함되어 있습니다.

+0

+1 XSLT 1.0의 가치 대 가치의 사용에 대한 훌륭한 설명. –