Преобразование текстового элемента XSLT в «один пробел» приводит к пустому содержимому - PullRequest
1 голос
/ 08 октября 2010

Я получил этот входящий 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>

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

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

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

Ответы [ 2 ]

1 голос
/ 08 октября 2010

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

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

Трансформация убивает пробел во 2-м элементе в источник

Вы принимаете <xsl:copy> за <xsl:copy-of>

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

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

1 голос
/ 08 октября 2010

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

<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" во входной источник.

...