2016-04-13 3 views
0

У меня есть большой процесс XSD I, используя несколько шаблонов для получения нового XSD. В одном из последних шагов я хотел бы определить длину xml (фактически XSD), который был захвачен переменной xsdresult.строка длина структуры xml

Используя функцию длины строки, я вижу странную длину, не соответствующую переменной xsdresult. Размер строки/xsd превышает 52000 символов, но я вижу Length: 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 для разделителей начального тега < ... >, а также сумма длин спецификаций значений атрибутов.
  • Для каждой спецификации атрибута вам понадобится один символ для ведущего пробела, а также длина имени атрибута плюс длина строки значения атрибута плюс три для знака равенства и кавычек плюс пять символов для каждый раз, когда кавычка заменяется на &apos; или &quot;.
  • Для каждого непустого элемента длина его концевого тега (длина его имени типа элемента плюс 3).
  • Для каждого пустого элемента длина его единственного тега (длина имени его элемента, плюс длина его атрибутных значений, плюс 3).
  • Для каждого вхождения < в данных или в значениях атрибутов три символа для экранирования как &lt;.
  • Для каждого ввода амперсанда в данных или значениях атрибутов четыре символа для экранирования как &amp;.

Не часть минимальной суммы, но, возможно, часть пространства вы будете нуждаться на диске:

  • Общая ширина любого пробельных добавила, если вы отступ XML структурны.
  • Число секций с пометкой, отмеченной CDATA, раз 12 (для <![CDATA[ + ]]>).
  • Число символов, сохраненных с помощью отмеченных по CDATA разделов вместо &lt; и &amp;.
+1

Может потребоваться также рассмотреть объявления пространства имен и префиксы пространства имен для элементов или даже атрибутов. – Flynn1179

Смежные вопросы