Преобразование текстового элемента XSLT с помощью одного символа пробела приводит к пустому содержимому

У меня есть этот входящий XML, который я преобразовываю (с XSLT в ASP с использованием msxsm6):

<Cell>  
  <Data xmlns="http://www.w3.org/TR/REC-html40">  
    <Font>Text1</Font>  
    <Font> </Font>  
    <Font>Text2</Font>  
  <Data>  
</Cell>

Если шаблон для ‹Шрифт›:

<xsl:template match="Font">
  <xsl:copy/>
</xsl:template>

Преобразование, кажется, убивает символ пробела во втором элементе в источнике, выходной XML-код приведен ниже, второй элемент становится пустым без содержимого:

    <Font>Text1</Font>  
    <Font/>  
    <Font>Text2</Font>  

Я пробовал и ошибался с ‹xsl:preserve-space elements="Font"/›', но это, похоже, не помогло. Идеи? Спасибо Stackoverflow!


person Dave    schedule 08.10.2010    source источник


Ответы (2)


Во-первых, ваш образец фрагмента таблицы стилей неверен. Вам понадобится такое правило:

<xsl:template match="html:data//node()|html:data//*/@*"
              xmlns:html="http://www.w3.org/TR/REC-html40"> 
  <xsl:copy>
     <xsl:apply-templates select="node()|@*"> 
  </xsl:copy> 
</xsl:template>

Во-вторых, о входных пробелах только текстовые узлы. Они будут сохранены в зависимости от поставщика XML-дерева. MSXSL не сохраняет его по умолчанию. Единственное решение — добавить атрибут xml:space="preserve" в источник ввода.

person Community    schedule 08.10.2010

Если шаблон для:

<xsl:template match="Font"> 
  <xsl:copy/> 
</xsl:template>

Преобразование, кажется, убивает символ пробела во 2-м элементе в источнике

Вы ошибаетесь <xsl:copy> за <xsl:copy-of>

Первый копирует только текущий элемент и его узлы пространства имен (не копирует атрибуты или узлы-потомки), в то время как второй копирует полное поддерево с корнем в текущем узле.

Кроме того, у вас возникли проблемы с пространством имен, как отметил @Alejandro, и невозможно, чтобы предоставленный код XSLT при применении к предоставленному XML-документу дал предоставленный «результат».

person Dimitre Novatchev    schedule 08.10.2010
comment
Спасибо Дмитрию и Алехандро! Вы правы, вывод не соответствует вводу, потому что я слишком упростил некоторые элементы пространства имен в примере. Ваши идеи прямо в цель, большая помощь и спасибо! К сожалению, я не могу изменить входящий XML. - person Dave; 10.10.2010
comment
@Dave: Вы должны предоставить реальный пример, демонстрирующий вашу проблему, тогда мы поможем вам найти полное решение. Итак, отредактируйте свой вопрос и предоставьте точную информацию. - person Dimitre Novatchev; 10.10.2010