XSLT adı öğesi var mı?


102

XSLT'de

<xsl:value-of select="expression"/>

bir öğenin değerini almak için, ancak öğenin etiket adını seçecek bir şey var mı?

Böyle bir durumda:

<person>
  <!-- required stuff -->
  <name>Robert</name>
  <!-- optional stuff, free form for future extension. 
       Using XMLSchema's xsd:any -->
  <profession>programmer</profession>
  <hobby>photography</hobby>
</person>

<xsl:for-each select="person">
   <xsl:tag-of select="."/> : <xsl:value-of select="."/>
</xsl:for-each>

Bunun gibi çıktı almak için:

name : Robert
profession : programmer
hobby : photography

Elbette yukarıdaki XSLT derlenmeyecek çünkü

 <xsl:tag-of select="expression"/>

yok. Ama bu nasıl yapılabilir?


Bu soru için en alakalı etiket XPath'dir. Her iki işlev de XPath standart işlevleridir ve herhangi bir barındırma dili bağlamında bir XPath ifadesi içinde kullanılabilir (C #, XSLT, XQuery, ...) Lütfen, yeniden etiketleyin
Dimitre Novatchev

Bu metin: "XSLT'de <xsd: value-of select =" expression "/>" vardır - bir hata içerir. XSLT komutları için genellikle kullanılan önek "xsl" dir. Genellikle XML Şemasını kullanırken "xsd" veya "xs" önekini kullanırız. Lütfen düzeltin.
Dimitre Novatchev

Yanıtlar:


158

Bu size mevcut eleman adını (etiket adı) verecektir.

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

OP-Edit: Bu aynı zamanda hile yapacak:

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

12
local-name 10 üzerinden 9 kez istediğin şey
annakata

20
local-name sans isim alanıdır, bu yüzden genellikle daha iyidir.
Jon W

102

Kimse fonksiyonlarının semantik ince farklılıkları işaret yaptı name()ve local-name().

  • name(someNode) düğümün tam adını döndürür ve bu, düğümün bir öğe veya bir öznitelik olması durumunda önek ve iki nokta üst üste içerir.
  • local-name(someNode) Yalnızca düğümün yerel adını döndürür ve düğümün bir öğe veya bir öznitelik olması durumunda bu, önek ve iki nokta üst üste belirtmez.

Bu nedenle, bir adın iki farklı ad alanına ait olabileceği durumlarda, name()bu adların hala ayırt edilebilmesi için işlevin kullanılması gerekir .

Ve BTW, her iki işlevi de herhangi bir bağımsız değişken olmadan belirtmek mümkündür :

name() kısaltmasıdır name(.)

local-name() kısaltmasıdır local-name(.)

Son olarak , sadece elemanların ve özniteliklerin isimleri olmadığını, bu iki işlevin de PI'larda kullanılabileceğini ve bunlarda aynı olduklarını unutmayın.


15
<xsl:for-each select="person">
  <xsl:for-each select="*">
    <xsl:value-of select="local-name()"/> : <xsl:value-of select="."/>
  </xsl:for-each>  
</xsl:for-each>

İyi bir uygulama olarak, <xsl: value-of select = "normalize-space (.)" /> Düğümünün değerini alırken her zaman normalize-space () kullanın Bu, fazladan boşlukları keser
SO Kullanıcısı

Bu tür normalleştirme / temizleme, yalnızca girdi toplama aşamasında ele alınmamışsa gerekli olacaktır. Daha sonra bunu yapmak, genellikle çok daha sık olan erişim zamanında yapmak zorunda kalmadan tasarruf sağlar. Biri bunu bir RDB'ye eklemeden önce yapardı ve bir xml belgesi sadece başka bir veritabanıdır.
Patanjali

9

İlgilenenler için yok:

<xsl:tag-of select="."/>

Ancak, etiketi / öğeyi şu şekilde yeniden oluşturabilirsiniz:

<xsl:element name="{local-name()}">
  <xsl:value-of select="substring(.,1,3)"/>
</xsl:element>

Bu, örneğin birçok farklı öğe için biçimlendirme veri değerlerini işleyen bir xslt şablonunda kullanışlıdır. Üzerinde çalışılan öğenin adını bilmediğinizde ve yine de aynı öğeyi çıkarabilir ve gerekirse değeri değiştirebilirsiniz.


6
<xsl:value-of select="name(.)" /> : <xsl:value-of select="."/>

Öyleyse neden bu indirildi? Ad alanını da istemeseydiniz yerel-addan () bahsedilebilirdi, ancak bunun neden işe yaramayacağını açıklamak daha geniş topluluk için faydalı olacaktır.
Rowland Shaw

Belki de verilen XML'i dönüştüremedi. isim (.) bu durumda "kişi" olacaktır. "isim", "meslek" ve "hobi" olmalıdır.
Ray Lu

@CodeMelt Kabul edilen cevaba neden olumsuz oy vermediniz? İyi, ama bundan daha az spesifik. Sorunun cevabını sağladığı için Rowland Shaw'un cevabını yukarı oyladım. Lütfen, yalnızca bir soru yanlış, yanlış veya yanıltıcı bilgi
içerdiğinde olumsuz oy verin

4
Bu küçük ayrıntı düzeltildi - şahsen, insanların toplu bilgiyi açıklamaya yardımcı olduğu için bir şeyin neden olumsuz oy verildiğini açıklaması gerektiğini düşünüyorum ...
Rowland Shaw

İtibarımız dikkat çekebilir, ancak gönderdiklerimizin değerli olduğunun garantisi olmadığından, gerçekten önemli olan katkımızın kalitesidir. Kalitesiz katkılar için hiçbir sebep yoktur.
Patanjali
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.