Преобразование текстового элемента 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>  

Я пробовал и ошибался на ', но это не помогло. Идеи? Спасибо Stackru!

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" атрибут во входном источнике.

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

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

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

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

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

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

Другие вопросы по тегам