XSLT - удалите пробел из шаблона

При поиске специальных объектов, а не чего-то, что Вы поместили бы в SSIS. Из SSMS просто выделяют сетку результатов, копию, затем вставляют в Excel, это не изящно, но работы. Тогда можно сохранить как собственный .xls, а не .csv

45
задан Robert DeBoer 24 September 2009 в 17:23
поделиться

4 ответа

В XSLT пробелы сохраняются по умолчанию, поскольку они вполне могут быть релевантными данными.

Лучший способ предотвратить появление нежелательных пробелов в выводе - не создавать их. на первом месте. Не делайте:

<xsl:template match="foo">
  foo
</xsl:template>

, потому что это "\ n ·· foo \ n" с точки зрения процессора. Скорее do

<xsl:template match="foo">
  <xsl:text>foo</xsl:text>
</xsl:template>

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

Кроме того, использование неопределенного:

<xsl:apply-templates />

проблематично, потому что правило XSLT по умолчанию для текстовых узлов гласит: «скопируйте их в выход". Это также относится к узлам «только пустое пространство». Например:

<xml>
  <data> value </data>
</xml>

содержит три текстовых узла:

  1. «\ n ··» (сразу после
94
ответ дан 26 November 2019 в 21:04
поделиться

По умолчанию в шаблонах XSLT задано значение , что позволяет сохранять пробелы в выводе. Вы можете добавить , чтобы сообщить об этом где удалить пробелы.

Вам также может потребоваться включить директиву normalize-space, например так:

<xsl:template match="text()"><xsl:value-of select="normalize-space(.)"/></xsl:template> 

Вот пример сохранения / удаления пространства из W3 Schools .

8
ответ дан 26 November 2019 в 21:04
поделиться

As far as removing tabs but retaining separate lines, I tried the following XSLT 1.0 approach, and it works rather well. Your use of version 1.0 or 2.0 largely depends on which platform you're using. It looks like .NET technology is still dependant on XSLT 1.0, and so you're limited to extremely messy templates (see below). If you're using Java or something else, please refer to the much cleaner XSLT 2.0 approach listed towards the very bottom.

These examples are meant to be extended by you to meet your specific needs. I'm using tabs here as an example, but this should be generic enough to be extensible.

XML:

<?xml version="1.0" encoding="UTF-8"?>
<text>
        adslfjksdaf

                dsalkfjdsaflkj

            lkasdfjlsdkfaj
</text>

...and the XSLT 1.0 template (required if you use .NET):

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet  
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">   
 <xsl:template name="search-and-replace">
   <xsl:param name="input"/>
   <xsl:param name="search-string"/>
   <xsl:param name="replace-string"/>
   <xsl:choose>
    <xsl:when test="$search-string and 
                    contains($input,$search-string)">
       <xsl:value-of
           select="substring-before($input,$search-string)"/>
       <xsl:value-of select="$replace-string"/>
       <xsl:call-template name="search-and-replace">
         <xsl:with-param name="input"
               select="substring-after($input,$search-string)"/>
         <xsl:with-param name="search-string"
               select="$search-string"/>
         <xsl:with-param name="replace-string"
               select="$replace-string"/>
       </xsl:call-template>
    </xsl:when>
    <xsl:otherwise>
      <xsl:value-of select="$input"/>
    </xsl:otherwise>
   </xsl:choose>
  </xsl:template>                
  <xsl:template match="text">
   <xsl:call-template name="search-and-replace">
     <xsl:with-param name="input" select="text()" />
     <xsl:with-param name="search-string" select="'&#x9;'" />
     <xsl:with-param name="replace-string" select="''" />
   </xsl:call-template>    
  </xsl:template>
</xsl:stylesheet>

XSLT 2.0 makes this trivial with the replace function:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
      xmlns:xs="http://www.w3.org/2001/XMLSchema"
      exclude-result-prefixes="xs"
      version="2.0">
 <xsl:template match="text">
  <xsl:value-of select="replace(text(), '&#x9;', '')" />
 </xsl:template>
</xsl:stylesheet>
2
ответ дан 26 November 2019 в 21:04
поделиться

Другие уже указали на общую проблему. Конкретным для вашей таблицы стилей является то, что вы забыли для запятых:

   <xsl:choose>
    <xsl:when test="@TYPE">
     <xsl:value-of select="@TYPE" />,
    </xsl:when>
    <xsl:otherwise>Home </xsl:otherwise>
   </xsl:choose>
   <xsl:value-of select="STREET" />,
   <xsl:value-of select="CITY" />,
   <xsl:value-of select="STATE" />,
   <xsl:value-of select="ZIP" />,

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

Кроме того, избавьтесь от этого disable-output-escaping . Здесь ничего не происходит, поскольку вы не выводите XML.

1
ответ дан 26 November 2019 в 21:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: