Почему этот XSLT-код добавляет новую строку? - PullRequest
1 голос
/ 19 ноября 2009

в IE (может быть, FF тоже, но не уверен) следующий фрагмент из моей таблицы стилей XSL ...

<td>
  <xsl:element name="img">
    <xsl:attribute name="src">
      <xsl:value-of select="image" />
    </xsl:attribute>
  </xsl:element>
</td>

генерирует следующий код XHTML ...

<td><img src="
    someimage.jpg"></td>

эта новая строка, вставляемая после src=", вызывает проблемы при последующем анализе с использованием DOM есть идеи?

Заранее большое спасибо за помощь!

Ответы [ 5 ]

6 голосов
/ 19 ноября 2009

В одном из комментариев (к удаленному ответу) вы сказали, что ваш вклад выглядит следующим образом:

<image>
 someimage.jpg</image>

Отсюда и начинается ваш перевод строки - он является частью значения узла и поэтому сохраняется процессором XSL (он не «добавляется», как вы и предполагали).

Чтобы удалить пробел, вы должны изменить значение узла, прежде чем выводить его, лучше всего подходит в этом случае функция normalize-space(), так как URL, как правило, не содержат пробелов.

<td>
  <img src="{normalize-space(image)}"/>
</td>

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

Вопреки тому, что предложили многие другие, ваш XSLT-код не влияет на вывод. Все пробелы удаляются из таблицы стилей XSL перед началом обработки, так что это:

<td>
  <xsl:element name="img">
    <xsl:attribute name="src">
      <xsl:value-of select="image" />
    </xsl:attribute>
  </xsl:element>
</td>

хотя излишне многословно, эквивалентно этому:

<td>
  <xsl:element name="img"><xsl:attribute name="src"><xsl:value-of select="image" /></xsl:attribute>
  </xsl:element>
</td>

эквивалентно этому в отношении выходных пробелов:

<td><img src="{image}"/></td>

Однако, если в вашем XSL-коде есть паразитные узлы, все пробелы вокруг них сохраняются. Это означает, что вы не должны делать это:

<td>
  Stray Text
</td>

Так как это сгенерирует "\n Stray Text\n " текстовый узел в выводе. Лучше это:

<td>
  <xsl:text>Contained Text</xsl:text>
</td>

Относительно: "Но почему <xsl:strip-space> не работает?" Рекомендую прочитать Ответ Павла Минаева именно на этот вопрос .

2 голосов
/ 19 ноября 2009

Я попробовал ваш XSLT, и, действительно, я думаю, что вы должны переосмыслить свой выбор XSLT-процессора, потому что этого не должно быть.

Во всяком случае, это должно это исправить:

<xsl:attribute name="src">
  <xsl:text/><xsl:value-of select="image" /><xsl:text/>
</xsl:attribute>

EDIT:

Попробуйте это

<td>
    <img src="{image}"/>
</td>

Если это не сработает, то я ошеломлен .... возможно, проверьте ваш источник данных? Содержит ли вход XSLT:

<image>someimage.ext</image>

или

<image>
    someimage.ext
</image>

Если это последнее, то я думаю, что проблема может быть в вашем вводе, а не в вашем XSLT.

2 голосов
/ 19 ноября 2009

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

Вместо этого:

<td>
  <xsl:element name="img">
    <xsl:attribute name="src">
      <xsl:value-of select="image" />
    </xsl:attribute>
  </xsl:element>
</td>

сделать это:

<td>
  <img src="{image}"/>
</td>
1 голос
/ 19 ноября 2009

Я согласен с Робертом в том, что AVT - это лучший способ, но я бы также предложил бросить normalize-space () вокруг изображения, поскольку исходный xml может содержать символы новой строки:

<td>
  <img src="{normalize-space(image)}"/>
</td>

В моем тесте с использованием xalan 2.7 простое выполнение AVT не решило проблему, если в источнике был символ новой строки:

<image>
   abc.jpg
</image>
1 голос
/ 19 ноября 2009

Очень странная проблема, действительно ...

Вы пробовали это?

<xsl:attribute name="src"><xsl:value-of select="image" /></xsl:attribute>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...