XSLT'de yeni bir hat üretmek


198

XSLT'de metin çıktısı için yeni bir satır oluşturmak istiyorum. Herhangi bir fikir?


11
Sanırım, cevabı kabul etme zamanı :)
Florjon

Yanıtlar:


240

Aşağıdaki XSL kodu yeni satır (satır besleme) karakteri oluşturur:

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

Bir satır başı için şunları kullanın:

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

7
+1: <xsl:text>XSL dosyanızı yeniden biçimlendirebilecek ve boşlukla uğraşabilecek herhangi bir şey kullanırsanız, bu yeni satır yaklaşımından daha sağlamdır .
Ian Roberts

49

Bunu yapmak için benim tercih edilen yöntem şuna benzer:

<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>

Ardından, yeni satır çıktısı almak istediğinizde (belki de csv'de) aşağıdakine benzer bir çıktı alabilirsiniz:

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

Bu tekniği xml girişinden sql çıkarırken kullandım. Aslında, virgül, tırnak işaretleri ve yeni satırlar için değişkenler oluşturma eğilimindeyim.


3
Lütfen Florjon'un aşağıdaki cevabının benimkinden çok daha kararlı olduğunu unutmayın.
Nic Gibson

1
Muhtemelen artan kararlılık xml:space="preserve"için xsl:textöğeye bildirimi eklemeye değer , ancak @ Florjon'un cevabının muhtemelen daha güvenli olduğunu kabul ediyorum.
Flynn1179

Bu çözümün, arzu edilmeyen herhangi bir girinti dahil etme dezavantajı vardır.
wmassingham

47

Xsl: output etiketine Method = "text" özelliğini ekleyin ve XSL'deki gerçek içeriğinize uygun noktalara yeni satırlar ekleyin. XSL'nizin kaynak kodunu düzenli tutmayı tercih ediyorsanız &#10;, yeni bir satır istediğiniz varlığı kullanın .


31

Kullanabilirsiniz: <xsl:text>&#10;</xsl:text>

örneğe bakın

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

bunu dosyaya yazarsanız, ör.

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

bu değişken şu şekilde yeni bir satır dosyası oluşturur:

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

6

IMHO @Florjon'un verdiğinden daha fazla bilgiye gerek yok. Belki de bazen bizim için neden işe yaramayabileceğini anlamak için bazı küçük detaylar bırakılmıştır.

Her şeyden önce, a içindeki &#xa(hex) veya &#10(dec) <xsl:text/>her zaman işe yarar, ancak göremeyebilirsiniz.

  1. HTML biçimlendirmesinde yeni satır yoktur. Basit kullanmak <br/>iyi olur. Aksi takdirde beyaz bir boşluk görürsünüz. Kaynağı tarayıcıdan görüntülemek size gerçekten ne olduğunu söyleyecektir. Ancak, özellikle tüketici doğrudan bir tarayıcı değilse, bu davranışı beklediğiniz durumlar vardır. Örneğin, bir HTML sayfası oluşturmak ve tarayıcıya sunmadan önce yapısını boş çizgiler ve kimliklerle güzel bir şekilde biçimlendirmek istiyorsunuz.
  2. Nerede kullanmanız gerektiğini disable-output-escapingve nerede kullanmadığınızı unutmayın. Başka bir xml oluşturmak zorunda ve DTD bir stil sayfasından bildirmek zorunda aşağıdaki örneği alın.

İlk sürüm karakterlerden kaçar (xsl: text için varsayılan)

<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>

ve işte sonuç:

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

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

Tamam, beklediğimiz şeyi yapar, kaçış yapılır, böylece kullandığımız karakterler düzgün şekilde görüntülenir. Kök düğümü içindeki XML parçası biçimlendirmesi tarafından işlenir ident="yes". Ancak daha yakından baktığımızda , yeni satır karakterinin &#xakaçılmadığını ve olduğu gibi çevrilmediğini ve çift hat besleme gerçekleştirdiğini görüyoruz ! Bu konuda bir açıklamam yok, bilmek iyi olacak. Kimse?

İkinci sürüm karakterlerden kaçmaz, böylece amaçlandıklarını üretirler. Yapılan değişiklik:

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

ve işte sonuç:

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

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

ve bu iyi olacak. Hem cr hem de lf düzgün şekilde oluşturulur.

  1. Bahsettiğimizi unutma nl, değil crlf( nl=lf). İlk denemem sadece cr: kullanmaktı &#xdve xml çıktısı DOM tarafından doğru bir şekilde doğrulanırken.

Bozuk bir xml görüntülüyordum:

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

DOM ayrıştırıcısı kontrol karakterlerini dikkate almadı, ancak işlenmedi. Bunu ne kadar aptalca görmediğimi fark etmeden önce kafamı çarparak biraz zaman geçirdim!

Kayıt için, her yerde çalışacağından% 100 emin olmak için her iki CRLF ile vücudun içinde bir değişken kullanıyorum.


4

DOCTYPEBurada gördüğünüz yönergeyi ekledim :

<?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">

Bu , çıktıda yeni satır oluşturmak &nl;yerine kullanmamı sağlıyor &#xa;. Diğer çözümler gibi, bu genellikle bir <xsl:text>etiketin içine yerleştirilir .



2

Nic Gibson'ın yöntemini ikinci olarak seçtim, bu her zaman benim favorimdi:

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

Ancak stil sayfaları oluşturmak ve bunları dosyalara karşı çalıştırmak için Ant görev <echoxml> kullanıyorum. Görev, özellik değeri şablonları, örneğin $ {DSTAMP} yapacak, ancak xml'nizi de yeniden biçimlendirecektir, bu nedenle bazı durumlarda varlık referansı tercih edilir.

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

3
Bir değişken kullanırsanız, selectbunun yerine kullanmak daha iyi olur xsl:text. Örnek: <xsl:variable name="nl" select="'&#xA;'"/>Bu şekilde gereksiz bir RTF (sonuç ağacı parçası) oluşturmazsınız.
Daniel Haley

2

İçinde gerçek yeni satırlar <xsl:text>ile gerçek yeni satırlar arasında bir fark buldum &#xA;.

Değişmez yeni satırlar çevremde iyi çalışıyor olsa da (hem Saxon hem de varsayılan Java XSLT işlemci kullanılarak) kodum bir .NET ortamında çalışan başka bir grup tarafından yürütüldüğünde başarısız oldu.

Varlıklara ( &#xA;) geçmek, dosya oluşturma kodumu Java ve .NET üzerinde tutarlı bir şekilde çalıştırdı.

Ayrıca, gerçek yeni satırlar IDE'ler tarafından yeniden biçimlendirilmeye karşı savunmasızdır ve dosya 'bilinmeyen' biri tarafından korunduğunda yanlışlıkla kaybolabilir.


2

Yeni bir hat üreten benim deneyimlerinden fark ettik İÇİNDEKİ bir <xsl:variable>maddede işi yapmaz. Gibi bir şey yapmaya çalışıyordum:

<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>

Bu "yeni satıra" (boş <xsl:text>düğüm) koymaya çalıştığım herhangi bir şey , HTML'nin orada çalışmadığı gerçeğinden bahsetmemek için (bu sayfadaki daha basit önerilerin çoğu dahil) işe yaramadı, bu yüzden sonunda 2 değişkene ayırmak, onları <xsl:variable>kapsam dışında çağırmak ve <br/>aralarına basit koymak zorunda kaldık , yani:

<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>

Evet, biliyorum, bu en karmaşık çözüm değil ama işe yarıyor, sadece hayal kırıklığı deneyimimi XSL'lerle paylaşıyor;)


2

<xsl:text>&#xa;</xsl:text>XML yaklaşımını XSLT kullanarak biçimlendirirsem varlık kaybolacağı için sadece yaklaşımı kullanamadım . Bu yüzden değişkenleri kullanarak yaklaşım hakkında biraz daha yuvarlak kullanmak zorunda kaldım

<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

şu etiketi ekleyin:

<br/>

benim için çalışıyor;).


7
Soru metin çıktısıyla ilgili. Çözümünüz yalnızca çıktı HTML olarak işlenmişse çalışır.
oberlies
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.