使用xsl输出不需要的新行

时间:2012-03-12 06:26:00

标签: xml xslt

我有以下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 :(得分:0)

尝试

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

你也可以在模板块之前使用它..:

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

但是normalize-space()函数应该可以工作,这是更优选的。

答案 1 :(得分:0)

我知道防止不需要的换行的唯一方法是在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)
    }

答案 2 :(得分:0)

我以简单但不太好的方式解决了这个问题。

每个输出到目标文件的纯文本都应该包含<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>