нежелательная новая строка на выходе с использованием xsl - PullRequest
0 голосов
/ 12 марта 2012

У меня есть следующая структура XML:

    <method constructor="true" name="Main" public="true">
    <parameterList/>
    <block>
        <call>
            <callAttrbute>
                <variable name="addEventListener"/>
            </callAttrbute>
            <fieldAccess target="Event" name="ENTER_FRAME"/>
            <variable name="onEnterFrame"/>
        </call>
            <block>
    </method>

XML представляет собой структуру следующего кода:

        public function Main(){
        addEventListener(Event.ENTER_FRAME,onEnterFrame);
        }

Мой шаблон выглядит примерно так:

 <xsl:template match="method">
    <xsl:choose>
       <xsl:when test="@public">public </xsl:when>
       <xsl:otherwise>private </xsl:otherwise>
    </xsl:choose>
    <xsl:if test="@static"><xsl:text>static </xsl:text></xsl:if>
    <xsl:value-of select="@name" />
    <xsl:apply-templates select="*" />
 </xsl:template>

Я хочу следующий вывод (такой же, только для примера):

public function Main(){
        addEventListener(Event.ENTER_FRAME,onEnterFrame);
        }

Но результат перевода:

public Main()
        {
addEventListener
(Event.ENTER_FRAME,onEnterFrame);
}

В результате появляется так много нежелательных символов новой строкии пробелы, и кажется, что новая строка происходит от таблицы стилей.Как я могу получить правильный формат?

Ответы [ 3 ]

0 голосов
/ 12 марта 2012

Единственный способ предотвратить нежелательные переводы строк, который я знаю, - это объединить данные в самом xslt, как показано ниже.Это дает требуемый результат в XML Spy 2011, но может не давать того же в (например) Saxon.

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>
    <xsl:template match="root">
        <xsl:apply-templates/>
    </xsl:template>

    <xsl:template match="method">
        <xsl:choose>
           <xsl:when test="@public">public </xsl:when>
           <xsl:otherwise>private </xsl:otherwise>
        </xsl:choose><xsl:if test="@static"><xsl:text>static </xsl:text></xsl:if><xsl:text>function </xsl:text><xsl:value-of select="@name"/>{
        <xsl:call-template name="callAttribute"/>}
    </xsl:template>

    <xsl:template name="callAttribute">
        <xsl:value-of select="block/call/callAttribute/variable/@name"/>(<xsl:value-of select="block/call/fieldAccess/@target"/>.<xsl:value-of select="block/call/fieldAccess/@name"/>, <xsl:value-of select="block/call/variable/@name"/>)
    </xsl:template>
</xsl:stylesheet>

При применении к данному вводу это приводит к (в XML Spy):

public function Main{
        addEventListener(Event.ENTER_FRAME, onEnterFrame)
    }
0 голосов
/ 28 марта 2012

Я исправляю эту проблему простым, но не очень хорошим способом.

Каждый простой текст, который будет выводиться в целевой файл, должен быть заключен в <xsl:text></xsl:text>, включая символ новой строки и пробел.

<xsl:text>&#x9;</xsl:text>
<xsl:text>&#xa;</xsl:text>
<xsl:text>method</xsl:text>
<xsl:text>;</xsl:text>

Чтобы управлять форматом целевого файла, я вставляю новый символ новой строки и пробел в соответствии с глубиной узла.

Сначала определите шаблон.

<xsl:template name="show_lead_space_depth">
   <xsl:param name="nodedepth"/>
      <xsl:if test="$nodedepth=1 ">
   <xsl:text>&#x9;</xsl:text>
   </xsl:if>
      <xsl:if test="$nodedepth=2">
   <xsl:text>&#x9;&#x9;</xsl:text>
   </xsl:if>
</xsl:template>

Тогда звоните, когда нужно.

   <xsl:call-template name="show_lead_space_depth">
        <xsl:with-param name="nodedepth" select="count(ancestor::*)"/>
    </xsl:call-template>
0 голосов
/ 12 марта 2012

Попробуйте

<xsl:value-of select="normalize-space(@name)" />

Также вы можете использовать это перед блоками шаблона ..:

<xsl:strip-space select="element_name"/> 

Но функция normalize-space () должна работать, и это более предпочтительно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...