Сохранение атрибута пробела - PullRequest
10 голосов
/ 04 ноября 2008

Отказ от ответственности: следующее является грехом против 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 = "preserve" безрезультатно. Кажется, что каждая найденная опция применима для хранения пробелов в самих элементах, но не в атрибутах. Каждый раз вышеуказанное изменяется на:

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

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

Ответы [ 4 ]

5 голосов
/ 04 ноября 2008

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

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

3 голосов
/ 04 ноября 2008

Согласно спецификации Annotated XML , пробел в значениях атрибута нормализуется процессором XML (см. Аннотацию (T) на 3.3.3). Таким образом, похоже, что ответ, вероятно, нет.

1 голос
/ 04 ноября 2008

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

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

0 голосов
/ 21 апреля 2015

Если вы можете контролировать свой процессор 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
...