2

XSLT を使用してコードを生成するときに、インデントを正しく並べるのに問題があります。

生成されたコードでは、最初のコードが意図public Builder name...したとおりに配置されていることがわかります。しかし、そのメソッドの残りの部分は正しく配置されておらず、他のすべてのメソッドも正しく配置されていません。残りのコードのインデントに合わせてインデントするつもりでした。

この位置合わせの問題を解決するにはどうすればよいですか?

生成されたコードの正しさについて心配する必要はありません。例を示そうとしているだけです。


XSLT

<?xml version="1.0"?>
<xsl:stylesheet version="2.0"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:fn="http://www.w3.org/2005/xpath-functions">

    <xsl:output method="text" name="text" />
    <xsl:strip-space elements="*" />

    <xsl:template match="..." mode="builder">public Builder <xsl:value-of select="fu:lowercaseFirstLetter(@name)"/>(final String value) {
        this.dao.getMy<xsl:value-of select="fu:capitalizeFirstLetter(../@name)"/>().set<xsl:value-of select="fu:capitalizeFirstLetter(@name)"/>(value);
        return this;
    }
    </xsl:template>

    <xsl:template match... >
        <xsl:result-document href="..." format="text">
public class <xsl:value-of select="..."/> implements Parent {

    public boolean test(Object o) {

        <xsl:apply-templates mode="builder"/>

        return true;

    }

}

        </xsl:result-document>
    </xsl:template>
</xsl:stylesheet>

生成されたコード

public class ATest implements Parent {

    public boolean test(Object o) {

        public Builder name(final String value) {
        dao.getMyATest().set_valid(value);
        return this;
    }
    public Builder name(final String value) {
        dao.getMyATest().set_valid(value);
        return this;
    }
    public Builder name(final String value) {
        dao.getMyATest().set_valid(value);
        return this;
    }
    public Builder name(final String value) {
        dao.getMyATest().set_valid(value);
        return this;
    }

        return true;

    }

}

意図した結果

public class ATest implements Parent {

    public boolean test(Object o) {

        public Builder name(final String value) {
            dao.getMyATest().set_valid(value);
            return this;
        }
        public Builder name(final String value) {
            dao.getMyATest().set_valid(value);
            return this;
        }
        public Builder name(final String value) {
            dao.getMyATest().set_valid(value);
            return this;
        }
        public Builder name(final String value) {
            dao.getMyATest().set_valid(value);
            return this;
        }

        return true;

    }

}
4

1 に答える 1

2

解決策 1: 生成された Java のインデントについて心配する必要はありません。後処理フェーズとしてフォーマッターに渡します。

解決策 2: 空白の生成に細心の注意を払う。スタイルシートを読みやすくするために使用される空白と、出力する空白を区別するために、常に xsl:text を使用して、空白を含むリテラル テキスト出力を結果に囲みます。現在のインデント レベルを指定するすべてのテンプレート ルールに「インデント」パラメーターを設定し、apply-templates を呼び出すときに X を追加します。

<xsl:apply-templates>
  <xsl:with-param name="indent" select="$indent + 2"/>
</xsl:apply-templates>

インデントの空白を生成する関数または名前付きテンプレートを用意します。

<xsl:call-template name="do-indent">
  <xsl:with-param name="indent" select="$indent + 2"/>
</xsl:call-templates>
于 2013-03-12T18:46:36.103 に答える