Как убрать возврат каретки только с XSLT? - PullRequest
5 голосов
/ 02 июля 2011

У меня есть XML-код, который может иметь две формы:

Форма 1

<?xml version="1.0">
<info>
</info>

Форма 2

<?xml version="1.0">
<info>
  <a href="http://server.com/foo">bar</a>
  <a href="http://server.com/foo">bar</a>
</info>

Из цикла я читаю каждую форму xml и передаю ее в таблицу стилей xslt.

XSLT-код

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
    <xsl:strip-space elements="*" />

    <xsl:template match="*|@*|text()">
       <xsl:apply-templates select="/info/a"/>
    </xsl:template> 

    <xsl:template match="a">
       <xsl:value-of select="concat(text(), ' ', @href)"/>
       <xsl:text>&#13;</xsl:text>
    </xsl:template>
</xsl:stylesheet>

И я получаю это:


bar http://server.com/foo
bar http://server.com/foo

Как мне удалить первую пустую строку с только XSLT ?

Ответы [ 3 ]

2 голосов
/ 02 июля 2011

Из цикла я читаю каждую форму xml и передаю ее в таблицу стилей xslt.

Может быть из вашего приложения выполнение таблицы стилей впустая форма (Форма 1) вызывает это.Попробуйте справиться с этим, выполняя таблицу стилей только в том случае, если форма не пуста.

Кроме того, вы можете изменить свою таблицу стилей на эту:

<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="2.0">

    <xsl:output method="text"/>
    <xsl:strip-space elements="*" />

    <xsl:template match="info/a">
        <xsl:value-of select="concat(normalize-space(.), 
            ' ',
            normalize-space(@href))"/>
            <xsl:if test="follwing-sibling::a">
             <xsl:text>&#xA;</xsl:text>
            </xsl:if>
    </xsl:template>

</xsl:stylesheet>

Где normalize-space() используется для обеспечениячто в ваших входных данных нет лишних пробелов.

1 голос
/ 02 июля 2011

Вы хотите использовать метод вывода текста, обрабатывать только те узлы, которые вам нужны, и не выводить новую строку после последней a (или перед первой, как показано в приведенном ниже решении)

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">

  <xsl:output method="text"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="info">
    <xsl:apply-templates select="a"/>      
  </xsl:template> 

  <xsl:template match="a">
    <xsl:if test="not(position() = 1)" xml:space="preserve">&#xA;</xsl:if>
    <xsl:value-of select="concat(text(), ' ', @href)"/>
  </xsl:template>

Вам нужна инструкция xml:space для xsl:text, чтобы при считывании таблицы стилей она не нормализовалась.

1 голос
/ 02 июля 2011

Это может зависеть от того, какой процессор XSL вы используете, но пробовали ли вы следующее?

<xsl:output method="text" indent="no" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...