2009-12-01 89 views
0

我有一个关于XSL转换的问题。让我们采取一个实例(在srcML)表示在C的typedef枚举:如何为srcML创建XSLT转换?

<typedef>typedef <type><enum>enum <name>SomeEnum</name> 
<block>{ 
<expr><name>Value0</name> = 0</expr>, 
<expr><name>Value1</name> = <name>SOMECONST</name></expr>, 
<expr><name>Value2</name> = <name>SOMECONST</name> + 1</expr>, 
<expr><name>ValueTop</name></expr> 
}</block></enum></type> <name>TSomeEnum</name>;</typedef> 

C版:

typedef enum SomeEnum 
{ 
    Value0 = 0, 
    Value1 = SOMECONST, 
    Value2 = SOMECONST + 1, 
    ValueTop 
} TSomeEnum; 

如何定义一个<xsl:template>以去除与所述线,例如,Value2

如何定义一个<xsl:template>删除最后一行(使用ValueTop),包括前面的逗号?

回答

1

由于输入XML的“散布文本”性质,这有点棘手。特别是逗号处理不是微不足道的,我提出的解决方案可能是错误的(即使它适用于此特定输入)。我建议给逗号处理部分更多思考,因为C语法很复杂,我对srcML不太了解。

无论如何,这是我的尝试。

<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:src="http://www.sdml.info/srcML/src" 
    xmlns="http://www.sdml.info/srcML/src" 
> 
    <!-- the identity template copies everything as is --> 
    <xsl:template match="node() | @*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node() | @*" /> 
    </xsl:copy> 
    </xsl:template> 

    <!-- empty templates will remove any matching elements from the output --> 
    <xsl:template match="src:expr[src:name = 'Value2']" /> 
    <xsl:template match="src:expr[last()]" /> 

    <!-- this template handles the commata after expressions --> 
    <xsl:template match="text()[normalize-space() = ',']"> 
    <!-- select the following node, but only if it is an <expr> element --> 
    <xsl:variable name="expr" select="following-sibling::*[1][self::src:expr]" /> 

    <!-- apply templates to it, save the result --> 
    <xsl:variable name="check"> 
     <xsl:apply-templates select="$expr" /> 
    </xsl:variable> 

    <!-- if something was returned, then this comma needs to be copied --> 
    <xsl:if test="$check != ''"> 
     <xsl:copy /> 
    </xsl:if> 
    </xsl:template> 

</xsl:stylesheet> 

我的输入是(I用于示例的目的的srcML命名空间):

<unit xmlns="http://www.sdml.info/srcML/src"> 
<typedef>typedef <type><enum>enum <name>SomeEnum</name> 
<block>{ 
<expr><name>Value0</name> = 0</expr>, 
<expr><name>Value1</name> = <name>SOMECONST</name></expr>, 
<expr><name>Value2</name> = <name>SOMECONST</name> + 1</expr>, 
<expr><name>ValueTop</name></expr> 
}</block></enum></type> <name>TSomeEnum</name>;</typedef> 
</unit 

和结果:

<unit xmlns="http://www.sdml.info/srcML/src"> 
<typedef>typedef <type><enum>enum <name>SomeEnum</name> 
<block>{ 
<expr><name>Value0</name> = 0</expr>, 
<expr><name>Value1</name> = <name>SOMECONST</name></expr> 
}</block></enum></type> <name>TSomeEnum</name>;</typedef> 
</unit>