2009-12-01 6 views
0

XSL 변환에 대한 질문이 있습니다.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; 

방법 Value2 예를 들어, 함께 줄을 제거하는 <xsl:template>를 정의하는 C의 형식 정의 열거를 나타냅니다 (srcML에서) 예를 가지고 가게?

<xsl:template>을 정의하여 앞의 쉼표를 포함한 마지막 줄 (ValueTop)을 제거하는 방법은 무엇입니까?

답변

1

입력 XML의 "interspersed text"특성으로 인해 약간 까다 롭습니다. 특히 쉼표 처리는 사소한 것이 아니며 제안 된 솔루션은 아마도 잘못된 것입니다 (이 특정 입력에 대해 작동하더라도). C 구문이 복잡하고 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> 

<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 네임 스페이스를 사용)했다

관련 문제