длина строки структуры xml

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

Используя функцию длины строки, я вижу странную длину, не соответствующую переменной длине 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>
...

person Pigna    schedule 13.04.2016    source источник
comment
Вероятно, string-length возвращает сумму длин всех узлов text() и исключает символы всех элементов и атрибутов вашего XSD.   -  person zx485    schedule 13.04.2016
comment
Ваша переменная имеет в качестве значения фрагмент результирующего дерева (XSLT 1.0) или временный документ (XSLT 2.0) узлов, но не сериализацию схемы, которую вы, кажется, ожидаете.   -  person Martin Honnen    schedule 13.04.2016
comment
Возможный дубликат XSLT: как преобразовать XML-узел в строку   -  person kjhughes    schedule 13.04.2016
comment
Это действительно указатель в правильном направлении. Нужно найти правильный способ перевести все из XSD в String. Кажется, в настоящее время теряются пространства имен и комментарии.   -  person Pigna    schedule 14.04.2016


Ответы (1)


Вызов string-length() эквивалентен вызову string-length(.), который, в свою очередь, приводит текущий узел к строке, поэтому он эквивалентен string-length(string(.)). Значением функции string() является строковое значение узла, которое для узла элемента является строкой, образованной конкатенацией всех дочерних текстовых узлов.

Если вы хотите узнать, какой минимальный объем места на диске займет сериализованный XML-документ при простой сериализации, вы должны добавить:

  • Для каждого непустого элемента длина его начального тега: длина имени типа элемента, плюс 2 для разделителей начального тега < ... >, плюс сумма длин спецификаций значений атрибутов.
  • Для каждой спецификации значения атрибута вам потребуется один символ для начального пробела, плюс длина имени атрибута, плюс длина строки значения атрибута, плюс три для знака равенства и кавычек, плюс пять символов для каждого раза, когда кавычки заменяются на &apos; или &quot;.
  • Для каждого непустого элемента длина его конечного тега (длина имени типа элемента плюс 3).
  • Для каждого пустого элемента длина его единственного тега (длина имени типа элемента плюс длина спецификаций значения атрибута плюс 3).
  • Для каждого появления < в данных или значениях атрибутов три символа для экранирования как &lt;.
  • Для каждого появления амперсанда в данных или значениях атрибутов четыре символа для экранирования как &amp;.

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

  • Общая ширина любого добавленного пробела, если вы делаете отступ XML структурно.
  • Количество разделов, помеченных CDATA, которые вы сериализуете, умноженное на 12 (для <![CDATA[ + ]]>).
  • Количество символов, сохраненных с помощью разделов с пометкой CDATA вместо &lt; и &amp;.
person C. M. Sperberg-McQueen    schedule 13.04.2016
comment
Возможно, также потребуется рассмотреть объявления пространств имен и префиксы пространств имен для элементов или даже атрибутов. - person Flynn1179; 13.04.2016