2016-04-13 8 views
0

Ich habe eine große XSD Ich verarbeite mehrere Vorlagen, um eine neue XSD zu bekommen. In einem der letzten Schritte möchte ich die Länge der XML (eigentlich eine XSD), die in einer Variablen xsdresult erfasst wurde, ermitteln.String-Länge einer XML-Struktur

Mit der String-Length-Funktion sehe ich eine seltsame Länge, die nicht mit der variablen Länge von xsdresult übereinstimmt. Größe der Zeichenfolge/xsd ist über 52000 Zeichen, aber ich sehe Länge: 9862 Was mache ich falsch?

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

Wahrscheinlich gibt die 'string-length' die Summe der Längen aller' text() 'Knoten zurück und schließt die Zeichen aller Elemente und Attribute Ihrer XSD aus. – zx485

+0

Ihre Variable hat als Ergebnis ein Ergebnisbaumfragment (XSLT 1.0) oder ein temporäres Dokument (XSLT 2.0) von Knoten, aber keine Serialisierung des Schemas, das Sie zu erwarten scheinen. –

+0

Mögliches Duplikat von [XSLT: So wandeln Sie den XML-Knoten in einen String um] (http://stackoverflow.com/questions/6696382/xslt-how-to-convert-xml-node-to-string) – kjhughes

Antwort

1

Ein Aufruf von string-length() ist äquivalent zu einem Aufruf von string-length(.), was wiederum den aktuellen Knoten auf einen String nötigt, so liegt es an string-length(string(.)) äquivalent. Der Wert der string()-Funktion ist der Zeichenfolgenwert des Knotens, der für einen Elementknoten die Zeichenfolge ist, die durch die Verkettung aller untergeordneten Textknoten gebildet wird.

Wenn Sie wissen wollen, wie die minimale Menge an Speicherplatz des serialisierten XML-Dokument auf der Festplatte nehmen, eine einfache Serialisierung gegeben, dann müssen Sie hinzufügen:

  • Für jedes nicht leeres Element, deren Länge sein Start-Tag: die Länge des Namens des Elementtyps plus 2 für die Start-Tag-Trennzeichen < ... >, plus die Summe der Längen der Attributwert-Spezifikationen.
  • Für jede Attributwertspezifikation benötigen Sie ein Zeichen für führende Leerzeichen sowie die Länge des Attributnamens plus die Zeichenfolgenlänge des Attributwerts plus drei für das Gleichheitszeichen und die Anführungszeichen plus fünf Zeichen für Jedes Mal, wenn ein Anführungszeichen durch &apos; oder &quot; ersetzt wird.
  • Für jedes nicht leere Element die Länge seines End-Tags (Länge des Elementtyps Name plus 3).
  • Für jedes leere Element die Länge seines einzigen Tags (Länge des Namens seines Elementtyps plus Länge seiner Attributwertspezifikationen plus 3).
  • Bei jedem Auftreten von < in den Daten oder in Attributwerten, drei Zeichen für die escaping als &lt;.
  • Für jedes Auftreten von kaufmännisches Und-Zeichen in den Daten oder in Attributwerten vier Zeichen zum Entkommen als &amp;.

nicht Teil des Mindestbetrages, aber möglicherweise einen Teil des Raumes Sie auf der Festplatte benötigen:

  • Die Gesamtbreite aller Leerzeichen hinzugefügt, wenn Sie die XML strukturell einrücken.
  • Die Anzahl der CDATA markierten Abschnitte, die Sie serialisieren, mal 12 (für <![CDATA[ + ]]>).
  • Die Anzahl der Zeichen, die bei Verwendung von CDATA-markierten Abschnitten anstelle von &lt; und &amp; gespeichert wurden.
+1

Möglicherweise müssen auch Namespacedeklarationen und Namespacepräfixe für Elemente oder sogar Attribute berücksichtigt werden. – Flynn1179