[xslt] XSLT에서 새로운 라인 생성

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



답변

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

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

A의 캐리지 리턴 , 사용 :

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


답변

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

<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을 출력 할 때이 기술을 사용했습니다. 실제로 쉼표, 따옴표 및 줄 바꿈에 대한 변수를 만드는 경향이 있습니다.


답변

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


답변

당신이 사용할 수있는: <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


답변

@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 % 확신합니다.


답변

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>태그 는 일반적으로 태그 안에 배치됩니다 .


답변

당신은 시도 할 수 있습니다,

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

작동합니다.