2016-04-13 21 views
0

新しいXSDを取得するために、いくつかのテンプレートを使用して、大きなXSD処理を行っています。 最後のステップの1つでは、変数xsdresultに取り込まれたxml(実際にはXSD)の長さを調べたいと思います。xml構造体の文字列長

文字列長関数を使用すると、xsdresultの可変長と一致しない不思議な長さが表示されます。文字列/ xsdのサイズは52000文字を超えていますが、長さが表示されます:9862何が間違っていますか?

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

おそらく 'string-length'はすべての' text() 'ノードの長さの合計を返し、XSDのすべての要素と属性の文字を除外します。 – zx485

+0

変数の値としてノードの結果ツリーフラグメント(XSLT 1.0)または一時ドキュメント(XSLT 2.0)がありますが、期待しているようなスキーマのシリアル化はありません。 –

+0

[XSLT:XMLノードを文字列に変換する方法]の重複している可能性があります(http://stackoverflow.com/questions/6696382/xslt-how-to-convert-xml-node-to-string) – kjhughes

答えて

1

string-length()への呼び出しは、順番に文字列に現在のノードを強制string-length(.)への呼び出しに相当し、それはstring-length(string(.))に相当します。 string()関数の値は、ノードの文字列値です。これは、要素ノードの場合、すべての子孫テキストノードを連結した文字列です。各非空要素について

  • 、の長さを:あなたは、単純な直列化与えられたシリアル化されたXML文書がディスクに取るスペースの最小量は、その後、あなたが追加する必要があります方法を知りたい場合は

    開始タグ:要素タイプ名の長さに開始タグ区切り文字の2を加えたもの< ... >に、属性値指定の長さの合計を加えたもの。

  • 各属性値の指定には、空白の先頭に1文字を加え、属性名の長さに属性の値の文字列長を加えたものと、等号と二重引用符に3文字を加えたものと、引用符が&apos;または&quot;に置き換えられるたびに。
  • 各空でない要素については、その終了タグの長さ(要素タイプ名の長さ+ 3)。
  • 各空要素について、その唯一のタグの長さ(要素タイプ名の長さ+属性値指定の長さ+ 3)。
  • データまたは属性値にそれぞれ<が出現するたびに、エスケープするための3文字が&lt;となります。
  • データまたは属性値にアンパサンドが出現するたびに、エスケープするための4文字が&amp;となります。

ない最小量の一部が、あなたは、ディスク上の必要がありますスペースのおそらく一部:

  • あなたが構造的にXMLをインデント場合は空白の幅の合計は、追加。
  • シリアライズするCDATAセクションの数は、12回目(<![CDATA[ + ]]>)です。
  • &lt;および&amp;の代わりにCDATAセクションを使用して保存された文字数。
+1

また、名前空間の宣言や、要素や属性の名前空間接頭辞についても考慮する必要があります。 – Flynn1179

関連する問題