Как обрабатывать пробелы в текстовом файле, созданном из файла XML и XSLT?

Я работал над этим файлом XML (более 460 000 строк), чтобы извлечь все теги содержимого и сохранить их в отдельном текстовом файле. Этот XSLT-код выполнился и создал нужный мне файл, но я не понимаю, почему результирующий текстовый файл полон пробелов, даже если я использовал элемент пробела в XSLT-файле для стирания всех бесполезных пробелов.

это мой XML-файл:

<?xml version="1.0"?>
<sa>
    <review>
        <product>
            <name> 
                Scary movie
            </name>
        </product>
        <rating> 
            0.5 
        </rating>
        <content>
            bad
        </content>
    </review>
    <review>
        <product>
            <name> 
                The Space 
            </name>
        </product>
        <rating> 
            0.5
        </rating>
        <content>
            bad
        </content>
    </review>
</sa>

Это файл XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:strip-space elements="*"/>
    <xsl:output method="text"/>
    <xsl:template match="/*">
           <xsl:for-each select="review">
               <xsl:if test="rating=0.5">
                   <xsl:value-of select="ancestor-or-self::*/content"/>
               </xsl:if>   
            </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

И результат:

bad

bad

Почему между двумя тегами «контента» есть этот пробел?


person KeyPi    schedule 15.10.2015    source источник
comment
Можете ли вы показать нам результат, который вы хотите? В ваших данных много пробелов.   -  person Martin Honnen    schedule 15.10.2015
comment
просто code плохо плохо code   -  person KeyPi    schedule 15.10.2015


Ответы (1)


xsl:strip-space удаляет только те текстовые узлы, которые полностью состоят из пробелов. Он не обрезает начальные и конечные пробелы в узлах, которые также содержат печатный текст, например:

            <name> 
                The Space 
            </name>

Для этого обычный подход — normalize-space():

<xsl:value-of select="normalize-space(ancestor-or-self::*/content)"/>

Или вместо того, чтобы везде вставлять вызовы нормализации пространства, вы можете выполнить предварительную обработку документа, в котором есть правило шаблона удостоверения плюс правило

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

normalize-space() может делать больше, чем вы хотите - она ​​заменяет внутренние последовательности пробелов (включая новые строки) одним пробелом. В XSLT 2.0 достаточно просто написать собственную функцию trim(), которая делает что-то менее радикальное. В XSLT 1.0 это сложнее - для этого требуются рекурсивные именованные шаблоны - так что это определенно что-то для прохода предварительной обработки.

person Michael Kay    schedule 15.10.2015