Преобразование текстового элемента 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>
Я пробовал и ошибался на
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 приводил к предоставленному "результату".