2016-04-13 39 views
0

Yeni bir XSD almak için birkaç şablon kullanarak büyük bir XSD I işlemim var. Son adımlardan birinde, xsdresult değişkeninde yakalanan xml'nin (aslında bir XSD) uzunluğunu belirlemek istiyorum.xml yapısının dize uzunluğu

Dize uzunluğu işlevini kullanarak xsdresult değişken uzunluğuna uymayan garip bir uzunluk görüyorum. Dize/xsd'nin boyutu 52000 karakterden fazladır ama ben Uzunluk: 9862'yi görüyorum Ne yanlış yapıyorum? string-length() için

<!-- Catch output in variable --> 
    <xsl:variable name="xsdresult"> 
     <xsl:call-template name="start"/> 
    </xsl:variable> 

    <xsl:template name="start"> 
     <xsl:apply-templates/> 
    </xsl:template> 


    <!-- Build required doc parts --> 
    <xsl:variable name="docparts"> 
     <xsl:call-template name="builddocparts"/> 
    </xsl:variable> 

    <xsl:template name="builddocparts"> 
     Length: <xsl:value-of select="string-length(normalize-unicode($xsdresult))"/> 
    </xsl:template> 
... 
+0

Muhtemelen, "dize uzunluğu", tüm metin() 'düğümlerinin uzunluklarının toplamını döndürür ve XSD'nizin tüm öğelerinin ve özniteliklerinin karakterlerini hariç tutar. – zx485

+0

Değişkeniniz, sonuç olarak bir ağaç parçası (XSLT 1.0) veya düğümlerin geçici bir belgesi (XSLT 2.0) değeridir, ancak beklediğiniz gibi bir şema serileştirmez. –

+0

Olası kopyası [XSLT: XML Düğümünü String'e dönüştürme] (http://stackoverflow.com/questions/6696382/xslt-how-to-convert-xml-node-to-string) – kjhughes

cevap

1

bir çağrı sırayla bir dizeye akım düğümü coerces string-length(.) bir çağrı, eşdeğerdir, yani string-length(string(.)) eşdeğerdir. string() işlevinin değeri, düğümün dize değeridir; bu, bir öğe düğümü için tüm alt metin düğümlerinin birleşimiyle oluşturulan dizgidir. Her boş olmayan bir öğe için

  • , uzunluğu: Basit bir seri verilen tefrika XML belgesi diskte alacak alan asgari miktarı, ardından eklemek gerekir nasıl bilmek istiyorsanız

    başlangıç ​​etiketi: öğe türü adının uzunluğu, artı etiket sınırlayıcıları için 2 artı < ... >, artı özellik değeri belirtimlerinin uzunluklarının toplamı.

  • Her öznitelik değeri belirtimi için, boşluk karakterleri için bir karaktere, öznitelik adının uzunluğuna ek olarak öznitelik değerinin dize uzunluğuna, artı eşittir işareti ve tırnak işaretleri için üç, artı beş karakter için her seferinde bir tırnak işareti &apos; veya &quot; ile değiştirilir.
  • Her boş olmayan öğe için, bitiş etiketinin uzunluğu (öğe türü adının uzunluğu artı 3).
  • Her boş öğe için, kendi etiketinin uzunluğu (öğe türü uzunluğunun uzunluğu, artı değer özelliklerinin uzunluğu artı 3).
  • Verilerin veya öznitelik değerlerinde <'un her oluşu için çıkış için üç karakter &lt; olarak.
  • Verilerdeki veya öznitelik değerlerinde her bir ve işareti öğesi için, kaçış için dört karakter &amp; olarak.

Değil minimum miktarda bir parçası, ancak diskte gerekir alanın muhtemelen kısmı: Eğer yapısal olarak XML girinti eğer

  • herhangi boşluk toplam genişliği ekledi.
  • Serialize ettiğiniz CDATA bölümlerinin sayısı, zaman 12 (<![CDATA[ + ]]> için).
  • CDATA kullanılarak kaydedilen karakter sayısı, &lt; ve &amp; yerine bölümler olarak işaretlendi.
+1

Ayrıca, ad alanı bildirimlerini ve ad alanı öneklerini de öğeler veya öznitelikler üzerinde dikkate almanız gerekebilir. – Flynn1179

İlgili konular