Подтвердить что ты не робот

Сохранение пробела атрибута

Отказ от ответственности: следующее против греха против XML. Вот почему я пытаюсь изменить его с помощью XSLT:)

Теперь мой XML выглядит следующим образом:

<root>
    <object name="blarg" property1="shablarg" property2="werg".../>
    <object name="yetanotherobject" .../>
</root>

Да, я помещаю все текстовые данные в атрибуты. Я надеюсь, что XSLT может спасти меня; Я хочу двигаться к чему-то вроде этого:

<root>
    <object>
        <name>blarg</name>
        <property1>shablarg</name>
        ...
    </object>
    <object>
        ...
    </object>
</root>

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

<object description = "This is the first line

This is the third line.  That second line full of whitespace is meaningful"/>

Я использую xsltproc под linux, но у него нет никаких вариантов сохранения пробелов. Я попытался использовать xsl: preserve-space и xml: space = "сохранить" безрезультатно. Кажется, что каждый найденный параметр применяется для хранения пробелов внутри самих элементов, но не для атрибутов. Каждый раз вышеизложенное изменяется:

This is the first line This is the third line.  That second line full of whitespace is meaningful

Итак, вопрос в том, могу ли я сохранить пробел атрибута?

4b9b3361

Ответ 1

Это на самом деле сырая проблема синтаксического анализа XML, а не то, что XSLT может вам помочь. XML-синтаксис должен преобразовывать символы новой строки в это значение атрибута в пробелы в соответствии с "3.3.3 Нормализация атрибутов в стандарте XML. Итак, все, что читает ваши атрибуты описания и сохраняет символы новой строки, делает это неправильно.

Возможно, вы сможете восстановить символы новой строки, предварительно обработав XML, чтобы избежать новых строк и # 10; символьные ссылки, если у вас также нет новых строк, в которых запрещены символы charrefs, например, внутри тегов. Charrefs должен выжить как контрольные символы до значения атрибута, где вы можете затем превратить их в текстовые узлы.

Ответ 2

В соответствии с аннотированной спецификацией XML пробел в значениях атрибутов нормализуется процессором XML (см. аннотацию (T) на 3.3 0,3). Таким образом, похоже, что ответ, вероятно, нет.

Ответ 3

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

Сначала вам нужно обработать файл за пределами XML, чтобы сохранить пробелы.

Ответ 4

Если вы можете управлять своим XML-процессором, вы можете это сделать.

Из моего другого ответа (который связан многими ссылками):

если у вас есть XML, например

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE elemke [
<!ATTLIST brush wood CDATA #REQUIRED>
]>

<elemke>
<brush wood="guy&#xA;threep"/>
</elemke>

и XSL, например

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet  version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template name="split">
  <xsl:param name="list"      select="''" />
  <xsl:param name="separator" select="'&#xA;'" />
  <xsl:if test="not($list = '' or $separator = '')">
    <xsl:variable name="head" select="substring-before(concat($list, $separator), $separator)" />
    <xsl:variable name="tail" select="substring-after($list, $separator)" />

    <xsl:value-of select="$head"/>
    <br/><xsl:text>&#xA;</xsl:text>
    <xsl:call-template name="split">
        <xsl:with-param name="list"      select="$tail" />
        <xsl:with-param name="separator" select="$separator" />
    </xsl:call-template>
  </xsl:if>
</xsl:template>


<xsl:template match="brush">
  <html>
  <xsl:call-template name="split">
    <xsl:with-param name="list" select="@wood"/>
  </xsl:call-template>
  </html>
</xsl:template>

</xsl:stylesheet>

вы можете получить html как:

<html>guy<br>
   threep<br>

</html>  

как проверено/создано с процессором вроде saxon командной строки:

java -jar saxon9he.jar -s:in.xml -xsl:in.xsl -o:out.html