XSLT에서 새로운 라인 생성


198

XSLT에서 텍스트 출력을위한 줄 바꿈을 만들고 싶습니다. 어떤 아이디어?


11
나는 대답을 받아 들일 때라고 생각합니다 :)
Florjon

답변:


240

다음 XSL 코드는 줄 바꿈 문자 를 생성합니다 .

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

A의 캐리지 리턴 , 사용 :

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

7
+1 : <xsl:text>XSL 파일을 다시 포맷하고 공백을 엉망으로 만드는 것을 사용하는 경우 개행 방식을 포함하는 것보다 강력 합니다.
Ian Roberts

49

이 작업을 위해 내가 선호하는 방법은 다음과 같습니다.

<xsl:stylesheet>

<xsl:output method='text'/>

<xsl:variable name='newline'><xsl:text>
</xsl:text></xsl:variable>

<!-- note that the layout there is deliberate -->

...

</xsl:stylesheet>

그런 다음 개행 (아마 csv)을 출력 할 때마다 다음과 같이 출력 할 수 있습니다.

<xsl:value-of select="concat(elem1,elem2,elem3,$newline)" />

XML 입력에서 SQL을 출력 할 때이 기술을 사용했습니다. 실제로 쉼표, 따옴표 및 줄 바꿈에 대한 변수를 만드는 경향이 있습니다.


3
아래 Florjon의 답변은 내 것보다 훨씬 안정적입니다.
Nic Gibson

1
안정성을 높이기 xml:space="preserve"위해 xsl:text요소에 선언 을 추가 할 가치가 있지만 @Florjon의 대답이 더 안전하다는 데 동의합니다.
Flynn1179

이 솔루션은 바람직하지 않은 들여 쓰기도 포함한다는 단점이 있습니다.
wmassingham

47

xsl : output 태그에 Method = "text"속성을 포함하고 적절한 지점에서 XSL의 리터럴 컨텐츠에 개행을 포함하십시오. XSL의 소스 코드를 깔끔하게 유지하려면 &#10;새 줄을 원하는 엔티티를 사용하십시오 .


31

당신이 사용할 수있는: <xsl:text>&#10;</xsl:text>

예를 참조하십시오

<xsl:variable name="module-info">
  <xsl:value-of select="@name" /> = <xsl:value-of select="@rev" />
  <xsl:text>&#10;</xsl:text>
</xsl:variable>

예를 들어 파일에 작성하면

<redirect:write file="temp.prop" append="true">
  <xsl:value-of select="$module-info" />
</redirect:write>

이 변수는 다음과 같이 줄 바꾸기 파일을 생성합니다.

commons-dbcp_commons-dbcp = 1.2.2
junit_junit = 4.4
org.easymock_easymock = 2.4

6

@Florjon이 준 것보다 더 많은 정보가 필요하지 않습니다. 어쩌면 우리에게 왜 효과가 없는지 이해하기 위해 작은 세부 사항이 남아있을 수 있습니다.

우선, 내부의 &#xa(16 진수) 또는 &#10(dec) <xsl:text/>는 항상 작동하지만 보이지 않을 수도 있습니다.

  1. HTML 마크 업에는 줄 바꿈이 없습니다. 간단한 <br/>것을 사용하면 잘됩니다. 그렇지 않으면 공백이 나타납니다. 브라우저에서 소스를 보면 실제로 무슨 일이 있었는지 알려줍니다. 그러나 특히 소비자가 브라우저가 아닌 경우이 동작이 예상되는 경우가 있습니다. 예를 들어, HTML 페이지를 작성하고 브라우저에 제공하기 전에 빈 줄과 ID로 형식이 지정된 구조를 보려고합니다.
  2. 사용해야 disable-output-escaping할 곳과 그렇지 않은 곳을 기억하십시오 . 다른 XML을 작성하고 스타일 시트에서 DTD를 선언해야하는 다음 예제를 보자.

첫 번째 버전은 문자를 이스케이프합니다 (xsl : text의 기본값)

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml" indent="yes" encoding="utf-8"/>

    <xsl:template match="/">
        <xsl:text>&lt;!DOCTYPE Subscriptions SYSTEM "Subscriptions.dtd"&gt;&#xa;&#xa;&#xd;</xsl:text>
        <xsl:copy>
            <xsl:apply-templates select="*" mode="copy"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="@*|node()" mode="copy">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()" mode="copy"/>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

결과는 다음과 같습니다.

<?xml version="1.0" encoding="utf-8"?>
&lt;!DOCTYPE Subscriptions SYSTEM "Subscriptions.dtd"&gt;

&#13;<Subscriptions>
    <User id="1"/>   
</Subscriptions>

좋아, 우리가 기대하는대로하고, 우리가 사용한 문자가 올바르게 표시되도록 이스케이프가 수행됩니다. 루트 노드 내부의 XML 부분 형식은에 의해 처리됩니다 ident="yes". 그러나 자세히 살펴보면 줄 바꿈 문자 &#xa가 그대로 이스케이프 처리되지 않고 이중 줄 바꿈이 수행되는 것을 볼 수 있습니다 ! 나는 이것에 대한 설명이 없다. 알아 주면 좋을 것이다. 누군가?

두 번째 버전은 문자를 이스케이프하지 않으므로 의도 한대로 제작합니다. 변경 사항은 다음과 같습니다.

<xsl:text disable-output-escaping="yes">&lt;!DOCTYPE Subscriptions SYSTEM "Subscriptions.dtd"&gt;&#xa;&#xa;&#xd;</xsl:text>

결과는 다음과 같습니다.

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE Subscriptions SYSTEM "Subscriptions.dtd">

<Subscriptions>
    <User id="1"/>   
</Subscriptions>

그리고 그것은 괜찮을 것입니다. cr과 lf가 모두 올바르게 렌더링됩니다.

  1. ( )가 nl아니라 에 대해 이야기하는 것을 잊지 마십시오 . 첫 번째 시도는 cr : 만 사용 하는 것이었고 출력 xml은 DOM에 의해 올바르게 검증되었습니다.crlfnl=lf&#xd

손상된 XML을보고있었습니다.

<?xml version="1.0" encoding="utf-8"?>
<Subscriptions>riptions SYSTEM "Subscriptions.dtd">
    <User id="1"/>   
</Subscriptions>

DOM 파서는 제어 문자를 무시했지만 렌더링하지 않았습니다. 내가 이것을 보지 못하는 것이 얼마나 어리석은지를 깨닫기 전에 머리를 부딪히는 데 꽤 많은 시간을 보냈습니다!

기록을 위해, 나는 CRLF와 함께 몸 안의 변수를 사용하여 모든 곳에서 작동한다는 것을 100 % 확신합니다.


4

DOCTYPE여기에 지시문을 추가했습니다 .

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xsl:stylesheet [
  <!ENTITY nl "&#xa;">
]>
<xsl:stylesheet xmlns:x="http://www.w3.org/2005/02/query-test-XQTSCatalog"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                version="2.0">

이렇게하면 출력에서 줄 바꿈을 생성하는 &nl;대신 사용할 수 있습니다 &#xa;. 다른 솔루션과 마찬가지로이 <xsl:text>태그 는 일반적으로 태그 안에 배치됩니다 .



2

나는 Nic Gibson의 방법을 두 번째로 사용했습니다.

<xsl:variable name='nl'><xsl:text>
</xsl:text></xsl:variable>

그러나 Ant 작업 <echoxml>을 사용하여 스타일 시트를 만들고 파일에 대해 실행했습니다. 이 작업은 속성 값 템플릿 (예 : $ {DSTAMP})을 수행하지만 XML도 다시 포맷하므로 일부 경우 엔터티 참조가 바람직합니다.

<xsl:variable name='nl'><xsl:text>&#xa;</xsl:text></xsl:variable>

3
변수를 사용하는 경우 select대신 대신 사용 하는 것이 좋습니다 xsl:text. 예 : <xsl:variable name="nl" select="'&#xA;'"/>불필요한 RTF (결과 트리 조각)를 만들지 않는 방법입니다.
Daniel Haley

2

<xsl:text>사용하여 리터럴 개행 문자와 리터럴 개행 문자의 차이점을 발견했습니다 &#xA;.

리터럴 개행은 Saxon과 기본 Java XSLT 프로세서를 모두 사용하는 환경에서 정상적으로 작동했지만 .NET 환경에서 실행되는 다른 그룹에서 코드를 실행할 때 코드가 실패했습니다.

엔티티 ( &#xA;)로 변경하면 파일 생성 코드가 Java와 .NET에서 일관되게 실행됩니다.

또한 리터럴 줄 바꿈은 IDE에서 다시 포맷하기에 취약하며 '알지 못하는 사람'이 파일을 유지 관리하면 실수로 손실 될 수 있습니다.


2

내 경험에 따르면 조항 내부 에서 새 줄을 만드는 <xsl:variable>것이 효과가 없다는 것을 알았 습니다. 나는 다음과 같은 일을하려고했다.

<xsl:variable name="myVar">
  <xsl:choose>
    <xsl:when test="@myValue != ''">
      <xsl:text>My value: </xsl:text>
      <xsl:value-of select="@myValue" />
      <xsl:text></xsl:text> <!--NEW LINE-->
      <xsl:text>My other value: </xsl:text>
      <xsl:value-of select="@myOtherValue" />
    </xsl:when>
  </xsl:choose>
<xsl:variable>

<div>
  <xsl:value-of select="$myVar"/>
</div>

"새 줄"(빈 <xsl:text>노드) 에 넣으려고 시도한 것은 HTML이 작동하지 않는다는 사실은 말할 것도없고,이 페이지에서 가장 간단한 제안을 포함하여 작동하지 않았습니다. 변수를 2 개의 변수로 나누고 <xsl:variable>스코프 외부로 변수를 호출하고 변수 <br/>사이 에 간단한 것을 넣으십시오 .

<xsl:variable name="myVar1">
  <xsl:choose>
    <xsl:when test="@myValue != ''">
      <xsl:text>My value: </xsl:text>
      <xsl:value-of select="@myValue" />
    </xsl:when>
  </xsl:choose>
<xsl:variable>

<xsl:variable name="myVar2">
  <xsl:choose>
    <xsl:when test="@myValue != ''">
      <xsl:text>My other value: </xsl:text>
      <xsl:value-of select="@myOtherValue" />
    </xsl:when>
  </xsl:choose>
<xsl:variable>

<div>
  <xsl:value-of select="$myVar1"/>
  <br/>
  <xsl:value-of select="$myVar2"/>
</div>

예, 가장 정교한 솔루션은 아니지만 XSL과 좌절 경험을 공유 하는 것이 좋습니다.)


2

<xsl:text>&#xa;</xsl:text>XSLT를 사용하여 XML 파일을 포맷하면 엔터티가 사라지기 때문에 접근 방식을 사용할 수 없었습니다 . 그래서 변수를 사용하는 접근법에 대해 약간 더 라운드를 사용해야했습니다.

<xsl:variable name="nl" select="'&#10;'"/>
<xsl:template match="/">
    <xsl:value-of select="$nl" disable-output-escaping="no"/>
    <xsl:apply-templates select="*"/>
</xsl:template>

-4

이 태그를 추가하십시오.

<br/>

그것은 나를 위해 작동합니다;).


7
문제는 텍스트 출력에 관한 것입니다. 출력이 HTML로 렌더링 된 경우에만 솔루션이 작동합니다.
준수
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.