Xml space preserve что это

Итак, продолжаем разговор. На всякий случай уточню, что начало здесь.

Про строковые значения и метод их хранения я уже вскользь упоминал в первой части, а сейчас поговорим подробнее. Представим, что у нас есть таблица, заполненная строковыми данными, и что она большая. При этом крайне маловероятно, что все значения в ней будут уникальны. Некоторые из них нет-нет, да повторятся где-нибудь в разных частях таблицы. Хранить такой массив «как есть» внутри XML-разметки листа нерационально с точки зрения ресурсов ПК. Поэтому все строковые значения вынесены в отдельный файл, %file%/xl/sharedStrings.xml. Часть его, которая нас интересует, выглядит, допустим, так:

Обратите внимание на атрибуты тега «count» и «uniqueCount»: их значения различаются. Дело в том, что в книге одну из строк я использовал дважды. При этом атрибуты не обязательны, то есть если их убрать, то Excel ошибки не выдаст, но при сохранении файла нарисует опять.

Здесь же можно сказать, что здесь, внутри тега можно играть с настройками шрифта. Для этого используется доработанная напильником система пробегов, применяемая в MS Word (до него мы еще доберемся). Выглядит это примерно так:

В этом примере строковое значение содержит 3 пробега. Чтобы было удобнее их рассматривать, я, пожалуй, вынесу их отдельными сорсами.

А здесь у нас есть и блок настроек шрифта и сохранение концевых пробелов.

Ну и еще коротенькая ремарка. Если есть необходимость сделать многострочную запись в ячейке, то здесь в строке просто будет обычный символ переноса, chr(10). Сам атрибут многострочности ячейки расположен в файле разметки листа. В однострочной ячейке символ переноса будет проигнорирован. Excel просто сделает вид, что его нет.

Файл разметки листа содержит следующие ключевые элементы (и, что важно, желательно располагать их именно в таком порядке):

Здесь надо дать пояснение. Собственно закрепление строки — тег

. И вот какие здесь использованы атрибуты:

Интересен нам здесь в основном атрибут defaultRowHeight, то есть высота столбца по умолчанию. Стандартный, привычный нам вариант — 15 у.е. Если назначить его, скажем, 30 у.е., то строки, для которых высота не указана отдельно, станут в 2 раза выше. Однако, для того чтоб применить значение, отличное от дефолтного, необходимо указать атрибут customHeight со значением «true». Выглядит это примерно так:

Вложенные теги обозначают не каждый один столбец, как могло показаться, а группу столбцов, идущих подряд и имеющих единую ширину.

Как видно, в тег вложены теги с атрибутом «r», обозначающим фактический (а не порядковый) номер строки: надо помнить, что, скажем, строка 1 может быть пустой, а строка 2 — нет.

«Букв, что ли, пожалели?» — спросите вы. «Экономия памяти» — ответит Microsoft. Если вспомнить про ограничение в 16 миллионов с гаком ячеек, становится понятна их мотивация. Выходит, в теории один (!) лишний символ в имени атрибута может привести к миллионам лишних символов при чтении всего файла.

В тег вложены теги — ячейки. В примере видно, что основных атрибутов у ячейки три:

То есть, строго говоря, нам надо указать кастомную высоту ячейки и поставить флаг применения этой самой кастомной высоты.

Как видно, одна объединенная ячейка обозначена одним тегом с единственным атрибутом ref, задающим диапазон объединения.

7. Тег . Фильтры, которые так любят видеть в отчетах наши пользователи. В заполненном виде тег выглядит так:

Нетрудно понять, что атрибут «ref» задает зону, занимаемую активными ячейками фильтров.

Ну и «на сладкое» в файле идут настройки страницы для печати. Вот пример из одного моего файла:

— предпочтительные настройки бумаги.

В комментариях к первой части была просьба поговорить собственно о редактировании этого чуда техники средствами PL/SQL. Следующая часть будет именно об этом.

Источник

Синтаксис XML

Инструкции по обработке.

Эпилог

В языке XML не определен индикатор конца документа, большинство приложений для этой цели используют завершающий тег корневого элемента документа. Таким образом, встретив завершающий тег корневого элемента, скорее всего, приложение закончит обработку документа, и эпилог обработан не будет.

Атрибуты.

Атрибуты используются, для того чтобы связать некоторую информацию с элементом, а не просто включить ее в содержание последнего. Однозначного ответа на вопрос что лучше выбрать элемент или атрибут не существует. Каждый выбирает то, что ему больше нравится. Атрибуты удобно использовать для описания простых значений или для указания типа элемента. Например, мы можем ввести в открывающий тег атрибут type ( который может принимать одно из значений: город, поселок, деревня) тогда данный тег может выглядеть следующим образом:

Атрибут xml:space

Атрибут xml:space может принимать значения «preserve» и » default «. Значение «preserve» предписывает сохранять пробельные символы в неприкосновенности. Значение » default » оставляет пробельные символы на усмотрение программы-обработчика.

Значение атрибута применяется не только к содержащему его элементу, но и ко всем его потомкам.

Пустые пространства.

Спецификация XML требует, чтобы анализатор передавал все символы, в том числе и символы пустых пространств в содержании элемента, приложению. Символы же пустых пространств в тегах элементов и значениях атрибутов могут быть удалены.

Атрибут xml:lang

Правильно оформленные и верные документы.

Концепция правильно оформленных документов позволяет использовать данные XML без необходимости конструировать внешние описания данных и ссылаться на них.

Анализаторы.

Некоторые анализаторы поддерживают оба типа, при этом в их конфигурации имеется возможность переключаться на один из них, в зависимости от того, надо ли проверять допустимость документа.

Событийно управляемые анализаторы.

Древовидные анализаторы.

Средства тестирования анализаторов.

Источник

Элементы xsl:preserve-space и xsl:strip-space

Элементы xsl:preserve-space и xsl:strip-space

Синтаксические конструкции этих элементов очень похожи:

Элемент xsl:preserve-space добавляет, a xsl:strip-space удаляет имя элемента из сохраняющего множества входящего документа.

Предположим, нам нужно сохранять пробельные символы во всех элементах d и удалять их в элементах с. Тогда в преобразовании достаточно указать

Вообще, обязательные атрибуты elements элементов xsl:strip-space и xsl:preserve-space содержат не сами имена элементов, а так называемые проверки имен. Проверка имени имеет три варианта синтаксиса.

? Синтаксис «*» используется для выбора произвольных имен. Ей будут соответствовать любые имена элементов.

? Синтаксис «имя» используется для выбора элементов с заданным именем. К примеру, проверке имени «d» будут соответствовать все элементы с именем «d».

? Синтаксис «префикс:*» используется для выбора всех элементов в данном пространстве имен. К примеру, если в документе определен префикс пространства имен upr в виде атрибута xmlns:upr=»http://www.upr.com», проверке имени «upr:*» будут соответствовать все элементы пространства имен, определяемого идентификатором «http://www.upr.com».

Предположим, что нам необходимо сохранить пробельные символы в элементе с именем с и удалить их в элементе e и элементах, принадлежащих пространству имен, определяемому идентификатором «urn:d».

Источник

Understanding xml:space

The xml:space=»preserve» attribute is common in some XML documents. But what the attribute means is obscured by the fact that it is often used for no good reason. It could be there in an element in the source code because some developer inserted it as an experiment and forgot to delete it again.

1. XML standard and xml:space

The xml:space attribute share another important fact with the xml:lang attribute. If a document is going to be validated with a schema processor, the attribute must be declared in the schema. The same is true for DTD.

2. The «default» value

The xml:space attribute can only have two values, «default» and «preserve». Since the «default» value in most situations acts as if the attribute is not used, it is seldom used. Here is the exception: The xml:space=»preserve» attribute applies to the element where it is declared, and in all descendents of that element, in children and their children. For that reason, xml:space=»default» makes sense if we want to overrule what a descendent element has inherited from an ancestor element.

3. Whitespace only text nodes

The spec says that «the value ‘preserve’ indicates the intent that applications preserve all the white space». What whitespace? If we read the spec carefully there is no doubt that we are not talking about whitespace in general but only about what is called «whitespace only text nodes».

White space only text nodes are indention between elements like linefeed, carriage return, tab and space. Such whitespace characters are only called whitespace only text nodes if they are not mixed with other text nodes or not beside other text nodes. If there is just one character present, not being a whitespace only text node, the whitespace characters are no longer whitespace only text nodes.

Take a look at the following example:

If we transform the above document and use the normalize-space() function, the leading and trailing whitespace inside the «test» element will be removed, and the consecutive spaces between «is» and «great» will be reduced to just one space character. «xml:space» is not about whitespace in general.

But indention in the form of linefeed, carriage return, tab and space between elements with no other text nodes around, will be preserved, like the whitespace between the «root» and the «test» element. Even if we in an XSLT stylesheet say and the whitespace only text nodes in the above document will be preserved if we use an XSLT processor like Saxon.

4. A poem as example

In the example above the white space characters are next to other text characters. For that reason the white space are not whitespace only text nodes. In the next example xml:space=»preserve» works as expected (if supported):

In the above example xml:space=»preserve» works as expected and we don’t need «br» elements after the «span» elements. The white space text nodes inside the «p» element and outside the «span» elements are white space only text nodes. The white space are not mixed with other text characters or are not next to other text characters.

5. Mixed content and xml:space

Whitespace only text nodes are almost always safe to add or to delete. You can add indention and you can take it away. But in mixed content, whitespace only text nodes often matters. Take a look at the following example:

Inside the «p» element we have two spaces. A space between «I» and «» and a space between «» and ««. Only the last space is a whitespace only text node. But in this case we can’t just remove it as we please. If we do, we remove an important space between two words.

To prevent such a whitespace from being removed we can add xml:space to the «p» element:

6. xsl:strip-space, xsl:preserve-space

7. Is xml:space supported?

8. How hard can it be

Just a last example to show how difficult it can be to get xml:space right. In the XML schema behind wordprocessingML as created by MS Word 2003 when saving to XML, some MS developer has forgotten to delete an xml:space=»preserve» attribute in the top-element of the schema itself being XML.

Источник

Недавно мне понадобилось встроить в CRM возможность создания отчетов в Excel посредством PHP, но готовые решения были сильно громоздкими. Поэтому я решил написать собственную библиотеку для работы с Excel файлами через PHP. Но информации о внутренности Excel было очень мало и мне пришлось собирать ее по крупинкам, иногда методами тыка, проб и ошибок разбирал работу некоторых элементов.

На написание данной статьи меня натолкнули уже существующие статьи от @Lachrimae.

Оглавление:

Структура файлов

Xml space preserve что это. Смотреть фото Xml space preserve что это. Смотреть картинку Xml space preserve что это. Картинка про Xml space preserve что это. Фото Xml space preserve что этоДерево файлов и подкаталогов

Некоторые файлы могут отсутствовать, такие как: xl/worksheets/_rels/sheet.xml.rels, xl/calcChain.xml, xl/printerSettings/printerSettings1.bin и sharedString.xml

В папках xl/worksheets, xl/printerSettings и xl/worksheets/_rels могут быть по несколько файлов.

Давайте разберёмся, для чего все эти файлы, начнём по порядку:

Разбор файла _rels/.rels

Разбор docProps/app.xml

Содержимое данного файла примерно такая (не все элементы могут присутствовать и иметь тот же вид, что и у меня):

Первая строка нам уже знакома.

Во второй строке открывающий тег properties и эта строка похожа на рассмотренную нами ранее.

Означает безопасность документа и в зависимости от числа имеет следующий посыл:

указывает режим отображения эскиза документа. Установите для этого элемента значение TRUE, чтобы включить масштабирование эскиза документа на экране. Установите для этого элемента значение FALSE, чтобы включить обрезку эскиза документа, чтобы отображались только те разделы, которые соответствуют отображаемому значению (из документации microsoft).

Далее открывается тег HeadingPairs, внутри которого описаны группы частей документа и количество частей в каждой группе. Эти части являются не частями документа, а концептуальными представлениями разделов документа.

Внутри HeadingPairs мы имеем 1 векторный контент, в котором имеются 2 его части (подробнее о векторах и baseType можно почитать в документации microsoft).

Первая часть означает, что мы описываем листы в книге, а во второй части указываем количество этих листов.

В теге Company можно записать название компании.

Элемент SharedDoc указывает, является ли этот документ в настоящее время общим для нескольких производителей. Если для этого элемента установлено значение TRUE, производителям следует проявлять осторожность при обновлении документа.

HyperlinksChanged указывает, что одна или несколько гиперссылок в этой части были обновлены исключительно в этой части производителем. Следующий производитель, который откроет этот документ, обновит отношения гиперссылок новыми гиперссылками, указанными в этой части.

Тег AppVersion указывает версию используемого приложения Excel при создании файла

Разбор docProps/core.xml

Содержимое файла примерно таково:

Первая строка нам уже знакома.

Во второй строке открывающий тег cp:coreProperties и эта строка похожа на рассмотренную нами ранее. Внутри него описываются свойства приложения:

Разбор xl/_rels/workbook.xml.rels

Примерное содержимое файла:

Этот файл похож на раннее рассмотренный нами, только здесь уже описываются зависимости для файлов, которые используются непосредственно в книге.

Здесь записаны зависимости всех листов в книге, файла со строковыми значениями, цепочками вычислений и прочих файлов (мы разберем эти файлы дальше)

Разбор xl/printerSettings/printerSettings1.bin

Это файл, содержащий код в бинарном виде. Чтобы разобрать этот файл нужно описать много вещей про бинарники, а, чтобы научить писать правильно такой файл, потребуется много сил, времени и много текста. Да и в целом не вижу смысла вам работать с этим файлом. (честно говоря, я сам поверхностно знаком с этой темой).

Разбор xl/theme/theme1.xml

Разбор xl/worksheets/_rels/sheet1.xml.rels

Содержимое этого файла может быть следующим:

Разбор xl/worksheets/sheet1.xml

Начинается самое интересное и большое в этой статье.

Начинается такой файл с обычного объявления типа документа xml и некоторых настроек:

Строка третья означает размер экспортируемого диапазона (с какой по какую ячейку находятся данные).

такая строка может выглядеть и вот так:

Здесь уже вместо атрибута activeCell стоит activeCellId, потому что в атрибуте sqref мы видим несколько диапазонов. исходя из этого выясняем, что активный диапазон является A1:C3. на изображении ниже показано, как выглядит такой вариант выделения ячеек.

Xml space preserve что это. Смотреть фото Xml space preserve что это. Смотреть картинку Xml space preserve что это. Картинка про Xml space preserve что это. Фото Xml space preserve что этоВыделенные ячейки

Про тег pane, sheetFormatPr и cols хорошо рассказано в статье от @Lachrimae:

Собственно, закрепление строки — тег

. И вот какие здесь использованы атрибуты:

ySplit — показывает количество закрепленных строк. Для закрепления столбцов есть аналогичный атрибут xSplit;

topLeftCell — указание левой верхней ячейки, видимой по умолчанию НЕзакрепленной области;

activePane — указание местонахождения НЕзакрепленной области. В руководствах сказано, что этот атрибут регулирует, с какой стороны будет НЕзакрепленная область. Правда, попробовав разные значения, я почему-то получил одинаковый результат. Как вариант «by default» я для себя выбрал bottomRight;

state — указатель состояния закрепленной области. Для простого закрепления строки используется значение frozen

Интересен нам здесь в основном атрибут defaultRowHeight, то есть высота столбца по умолчанию. Стандартный, привычный нам вариант — 15 у.е. Если назначить его, скажем, 30 у.е., то строки, для которых высота не указана отдельно, станут в 2 раза выше. Однако, для того чтоб применить значение, отличное от дефолтного, необходимо указать атрибут customHeight со значением «true». Выглядит это примерно так:

Вложенные теги обозначают не каждый один столбец, как могло показаться, а группу столбцов, идущих подряд и имеющих единую ширину.

Атрибут min — первый столбец группы;

Атрибут max — последний столбец группы;

Атрибут width — ширина столбца из группы;

Атрибут customWidth — флаг применения кастомной ширины, без него ширина все равно будет дефолтной;

здесь структура такова:

В Excel это будет выглядеть вот так:

Xml space preserve что это. Смотреть фото Xml space preserve что это. Смотреть картинку Xml space preserve что это. Картинка про Xml space preserve что это. Фото Xml space preserve что этоЯчейки с данными

Давайте разбираться, что же все-таки в коде происходит.

С тегом sheetData разобрались, идем дальше.

Про теги mergeCells и autoFilter снова обратимся к статье от @Lachrimae:

Как мы знаем, в Excel есть возможность объединения ячеек. Все объединенные ячейки на листе перечислены здесь. В заполненном виде тег выглядит примерно так:

Как видно, одна объединенная ячейка обозначена одним тегом с единственным атрибутом ref, задающим диапазон объединения.

Тег . Фильтры, которые так любят видеть в отчетах наши пользователи. В заполненном виде тег выглядит так:

Нетрудно понять, что атрибут ref задает зону, занимаемую активными ячейками фильтров.

Тег pageMargins задает поля сверху, снизу, справа, слева, у заголовков и у подвала для печатаемой страницы.

Тег pageSetup предпочтительные настройки бумаги, опять же, для печати.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *