我有以下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);
}
在结果中有太多不需要的换行符和空格,似乎新行来自样式表。 我怎样才能得到正确的格式?
答案 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>	</xsl:text>
<xsl:text>
</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>	</xsl:text>
</xsl:if>
<xsl:if test="$nodedepth=2">
<xsl:text>		</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>