0

私は xsl と関数型プログラミングにまったく慣れていないので、これについて助けていただければ幸いです

。いくつかの xml を変換して出力を提供するテンプレートがあります。問題は、タイプxs:dateの多くの要素があり、すべてが異なるコンテキストにあり、ローカライズする必要があることです。これらの xs:dates の部分文字列を連結して、ローカライズされた日付パターン文字列を生成します。

ご想像のとおり、これにより多くのコピー アンド ペースト " substring-this および substring-that " が発生します。タイプ xs:date のすべての要素をすべてのコンテキスト認識変換を保持するローカライズされた文字列に自動的に変換するテンプレートを作成するにはどうすればよいですか?

私のxslは次のようなものです:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">  
    <xsl:output method="html" encoding="utf-8"/>
        <xsl:template match="/">
        ...
        <input value="{substring(/select/a/date 9,2)}.{substring(/select/a/date, 6,2)}.{substring(/select/a/date 1,4)}">
        ...
        <!-- assume that following examples are also with substrings -->
        <div><xsl:value-of select="different-path/to_date"/></div>
        ...
        <table>
        <tr><td><xsl:value-of select="path/to/another/date"/></td></tr>
        </table>
        <apply-templates/>
        </xsl:template>
        <xsl:template match="something else">
        <!-- more dates here -->
        </xsl:template>
</xsl:stylesheet>

私は私の質問を明確にすることができたと思います=)

UPD: xml の例を次に示します。

<REQUEST>
    <header>
        <... />
        <ref>
            <ref_date type="xs:date">1970-01-01</ref_date>
        </ref>
    </header>

    <general>
        <.../>
        <info>
            <.../>
            <date type="xs:date">1970-01-01</date>
            <ExpireDate type="xs:date">1970-01-01</ExpireDate>
            <RealDate type="xs:date">1970-01-01</RealDate>
            <templateDetails>template details</templateDetails>
            <effectiveDate type="xs:date">1970-01-01</effectiveDate>
        </info>

        <party>
            <.../>
                <date type="xs:date">1970-01-01</date>
        </party>

        <!-- many other parts of such kind -->
    </general>

</REQUEST>

出力に関しては、さまざまなオプションがあります。主なことは、これらの値は、テーブル、入力フィールドなど、さまざまな html オブジェクトの値として設定する必要があるということです。xsl リストで例を確認できます。

PS私はxsl 1.0を使用しています。

4

2 に答える 2

2

スキーマを意識した XSLT 2.0 変換を行った場合、これらすべてのtype='xs:date'属性は必要ありません。スキーマで日付として定義するだけで十分です。次に、属性を次のように一致させることができます

<xsl:template match="attribute(*, xs:date)">

于 2012-09-12T14:29:58.550 に答える
1

あなたができることは、'xs:date' の @type 属性を持つ任意の要素に一致するようにテンプレートを追加することです。そこで部分文字列を操作しますか?

<xsl:template match="*[@type='xs:date']">
   <xsl:value-of select="translate(., '-', '/')" />
</xsl:template>

この場合、例としてハイフンをスラッシュに置き換えています。

次に、 xsl:value-ofを使用する代わりに....

<div><xsl:value-of select="different-path/to_date"/></div>  

xsl:apply-templatesを使用できます

<div><xsl:apply-templates select="different-path/to_date"/></div>  

この XSLT を例として考えてみましょう

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">        
    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="*[@type='xs:date']">
        <xsl:copy>
            <xsl:value-of select="translate(., '-', '/')" />
        </xsl:copy>
    </xsl:template>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

この場合、この XSLT は XML ドキュメントをそのままコピーするだけで、日付要素を変更します。

他の要素や値に日付テンプレートを使用したい場合は、次のように名前付きテンプレートにすることもできます。

<xsl:template match="*[@type='xs:date']" name="date">
    <xsl:param name="date" select="." />
    <xsl:value-of select="translate($date, '-', '/')" />
</xsl:template>

これにより、関数のように呼び出すこともできます。たとえば、データをフォーマットして属性として追加するには、次のようにします。

<input>
   <xsl:attribute name="value">
       <xsl:call-template name="date">
          <xsl:with-param name="date" select="/select/a/date" />
       </xsl:call-template>
   </xsl:attribute>
</input>
于 2012-09-12T13:25:15.500 に答える