삽입하는 방법 & nbsp; XSLT에서


207

삽입하는 방법

 

XSLT 스타일 시트 에이 오류가 계속 발생합니다.

XML 파싱 오류 : 정의되지 않은 엔터티

기본적으로 XSLT 템플릿에 공백이 아닌 문자를 원합니다.


2
& # xA0;을 사용할 수도 있습니다. & # 160;와 동일 여기를보십시오 stackoverflow.com/questions/7511214/…
user3766111 2018 년

답변:


337

 대신 엔티티 코드 를 사용하십시오 .

 HTML "문자 엔티티 참조"입니다. XML에는 비 공백 공간에 대한 명명 된 엔터티가 없으므로 코드를 사용합니다  .

위키 백과는 XML 및 HTML 개체의 목록을 포함 , 당신은 XML 만 5 "미리 정의 된 개체는"이 있다고 볼 수 있지만, HTML은 200 이상이 나는 또한에 이상 가리키는 것이다 공간을 만들기 (이 & nbsp;) XSL에 있다 훌륭한 답변.


3
우리는 최근 많은 XSL 중 하나 에서이 기술로 작업을 중단하고 이상한 캐릭터를 보여주기 시작한 상황에 처했습니다. 그러나 WaterSoul의 CDATA 기술을 사용하면 작동합니다.

@BrianReindel, 당신이, 즉 잘못된 숫자 엔티티 참조를 사용하는 것이 아마 수단 Š대신  항상 유니 코드가 아닌 깨는 공간으로 해결할 수있는 후자를.
Abel

Top 10 Java 및 XSLT Tips 링크 가 정말 유용합니다.
LCJ

<xsl : text> & # 160; </ xsl : text> 두 필드를 분리합니다
Manash Ranjan Dakua

1
링크가 썩었습니다.
GSerg

37

&#160;정말 잘 작동합니다. 그러나 ANSI 인코딩에서 이상한 문자 중 하나가 표시됩니다. <xsl:text>나를 위해 가장 잘 작동했습니다.

<xsl:text> </xsl:text>

3
허용 된 답변을 사용하여 XML 출력에 줄 바꿈 공간이 생겼습니다 (적어도 VS2010의 XML 편집기에서 보이는 모양). 이 답변을 사용하면 정확히 1 칸만 얻습니다.
Mathijs Flietstra

1
@ Matthijs, 이것은 깨지지 않는 공간이 아닌 공간입니다. VS가 잘못 표시하면 인코딩을 확인하십시오 (VS는이를 올바르게 표시 할 수 있으며 인코딩 독립적이어야하므로 다른 일을했을 가능성이 큽니다).
Abel

25

하나는 또한 이것을 할 수 있습니다 :

<xsl:text disable-output-escaping="yes"><![CDATA[&nbsp;]]></xsl:text>

2
프로세서가을 지원하는 경우disable-output-escaping 작동 합니다. 프로세서가 필요하지 않고 XSLT 2.0 이상에서는 3.0에서 더 이상 사용되지 않습니다. 이 버전에서는 xsl:character-map크로스 프로세서 작동 을 보장 하면서 동일한 효과에 도달 할 수 있습니다 . 또한 이것은 이름 지정된 엔티티 &nbsp;를 출력에 배치하며 , 이는 비 공백 공간반드시 같을 필요는 없으며 수신 측은 이 엔티티를 선언해야합니다 (HTML에서는 일반적으로 암시적임).
Abel

21

이것을 사용하십시오

<xsl:text disable-output-escaping="yes">&amp;</xsl:text>nbsp;

편집 : Downvoter는 아마도 이것이 먼저 작동하는지 확인해야합니다 (그렇지만 문제에 대한 가장 일반적인 해결책입니다).


1
확실하지는 않지만 내 접근 방식을 테스트했으며 작동하므로 downvote의
용도

2
또한 허용 된 답변이 링크 된 페이지에 따라 모든 파서에 대해 유효하지는 않습니다. 그냥 머리 위로
jagprinderdeep

1
나는 전에 downvote에 대한 이유를 제시했지만 대답 을 downvote 한다면 그 이유는 잘못된 질문에 대한 대답입니다. OP는 xslt를 사용하여 깨지지 않는 공간에 넣는 방법을 명확하게 요구했으며 앰퍼샌드 -nbsp- 세미콜론 시퀀스를 넣는 방법에 대답했습니다. 그리고 다운 보트를 다투는 것도 좋지 않습니다. 그러나 진지하게, CDATA에 대해 그런 말을 한 적이 있습니까?
Michael Krelin-해커

1
jagprinderdeep, 나는 나의 downvote를 취소하지만, 그 대신 정신 병원에 도착하면 나를 방문해주세요. (새로운 이유 때문에 공감대를 돌려주지 않습니다). 그러나 당신이 틀린 질문에 대답한다는 것을 이해하십시오. 나는 그것이 다른 다운 보트 뒤에있는 이유라고 생각합니다.
Michael Krelin-해커

8
또한 수신 측에서 & nbsp;을 (를) 선언 할 것이라고 보장 할 수 없으므로 하향 투표했습니다. xslt + html로 작업하는 경우 해킹이기는하지만 그렇게하는 방법입니다. 그러나 xslt를 사용하여 다른 xml을 생성한다면, 그것은 당신을 날려 버릴 것입니다.
Doug

14

파일 시작 부분 (xml 선언 아래)에이 엔티티에 대한 정의를 추가 할 수 있습니다.

<!DOCTYPE stylesheet [
<!ENTITY nbsp  "&#160;" >
]>

또한 Ntilde, Aacute 등과 같은 엔티티를 더 추가 할 수 있습니다.


5

victor hugo의 답변 외에도 XSLT 파일에서 다음과 같이 알려진 모든 문자 참조를 얻을 수 있습니다.

<!DOCTYPE stylesheet [
  <!ENTITY % w3centities-f PUBLIC "-//W3C//ENTITIES Combined Set//EN//XML"
      "http://www.w3.org/2003/entities/2007/w3centities-f.ent">
  %w3centities-f;
]>
...
<xsl:text>&amp; &nbsp; &ndash;</xsl:text>

이 접근법의 결과에는 <xsl:text disable-output-escaping="yes">하나 와 비교하여 특정한 차이가 있습니다 . 후자는 &nbsp;모든 종류의 출력 과 같은 문자열 리터럴을 생성 할 것이며 , 이는 원하는 결과 <xsl:output method="text">와 다를 수도 있습니다. 반대로 XSLT 템플릿에 대해 정의 된 엔티티를 통해 <!DOCTYPE ... <!ENTITY ...항상 출력과 일치하는 결과를 생성합니다. 당신의 xsl:output설정.

모든 문자 참조를 포함 할 때 XSLT 엔진이 인터넷에서 문자 엔티티 정의를 가져 오지 못하도록 로컬 엔티티 해석기를 사용하는 것이 좋습니다. JAXP 또는 명시적인 Xalan-J 사용자는 Xalan-J가 해석기를 올바르게 사용하기위한 패치가 필요할 수 있습니다. 패치 다운로드 및 의견 은 내 블로그 XSLT, 엔티티, Java, Xalan ... 을 참조하십시오 .


1
최근 W3는 자동화 된 프로세스에서 오는 경우 해당 링크 및 유사한 링크에 대한 너무 많은 요청을 차단하기 시작했습니다. 해당 파일을 로컬 또는 서버에 배치하고 그에 따라 URL을 조정하면 정상입니다. 그 외에는 +1이며 HTML 명명 된 엔터티를 사용하는 훌륭한 솔루션입니다.
Abel

참고로 엔터티 정의가있는 파일의 로컬 복사본을 가져야하는 또 다른 이유가 있습니다. 그렇지 않으면 인터넷에 연결할 수없는 경우 XSLT 프로세스가 실패 할 수 있습니다. 를 준비 할 수 있습니다으로 자바 세계에서 URL을 해킹 할 필요가 없다 의 EntityResolver , 그리고 아파치 XML 커먼즈 확인자가 좋은 후보가 될 수 있습니다. 다른 프로그래밍 플랫폼은 ... 너무 유사한 기술을 가능성이
세르게이 우샤 코프


2

다음을 사용하면 ( disable-output-escaping! 없이 ) 단절이 아닌 단일 공간이 생깁니다.

<xsl:text>&#160;</xsl:text>


4
당신은 이것을 필요 disable-output-escaping로 하지 않습니다
Ian Roberts

2

XSLT 스타일 시트는 올바른 형식의 XML이어야합니다. 이후 "&nbsp;"중 하나가 아닌 다섯 미리 정의 된 XML 엔티티 , 그것은 직접 스타일 시트에 포함 할 수 없습니다. 따라서 솔루션으로 돌아 오는 "&#160;"것은 "&nbsp;"사용해야 하는 완벽한 대체품입니다 .

예:

<xsl:value-of select="$txtFName"/>&#160;<xsl:value-of select="$txtLName"/>

0

당신은 또한 사용할 수 있습니다 :

<xsl:value-of select="'&amp;nbsp'"/>

& 뒤에 앰프를 기억하거나 오류 메시지가 나타납니다.


이것은 ``(nb-space)가 아닌으로 &amp;nbsp;렌더링 될 것이다 &nbsp;.
Abel

0

HTML 테이블의 빈 셀에 테두리를 표시하려고했습니다. 빈 셀에서 중단되지 않는 공간을 사용하는 나의 오래된 트릭은 xslt에서 작동하지 않았습니다. 같은 효과로 줄 바꿈을 사용했습니다. 비 공백 공간을 사용하려는 이유가 셀 경계를 설정하기 위해 '빈'테이블 셀에 일부 내용을 제공하는 경우를 대비하여 이것을 언급합니다.

<br/>

비슷한 시나리오가 있으며 테이블 셀을 렌더링하는 데 효과적입니다.
Richard Moore

0

사용하려고

<xsl:text>&#160;</xsl:text>

그러나 사용중인 XSLT 프로세서에 따라 다릅니다. XSLT 사양에는 XSLT 프로세서가 " &nbsp;" 로 변환 할 필요가 없습니다 .


0

@brabster와 다른 사람들이 이미 답변을 제공했지만.
더 재사용 가능한 솔루션은 다음과 같습니다.

<xsl:variable name="space">&#160;</xsl:variable>
...
<xsl:value-of select="$space"/>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.