0

この XML ドキュメントを変換しようとしています:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="test.xsl"?>
<data>
    <entry>
        <databit>30.11.2012</databit>
        <databit>Foo</databit>
        <databit>Key: Value<br />Key: Value<br /> ... Key: Value</databit>
        <databit>some Foo content</databit>
        <databit>more Foo content</databit>
    </entry>
    <entry>
        ...
    </entry>
    ...
</data>

キーと値のペアの数は可変です。セパレーターは常に<br />タグです。

出力は次のようになります。

<data>
    <entry>
        <date>30.11.2012</date>
        <title>Foo</title>
        <info>
            <part key="Key" value="Value" />
            <part key="Key" value="Value" />
            <part key="Key" value="Value" />
        </info>
        <databit>some Foo content</databit>
        <databit>more Foo content</databit>
    </entry>
    <entry>
        ...
    </entry>
    ...
</data>

私が書いた XSLT ドキュメントは次のとおりです。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:output method="xml" encoding="UTF-8" indent="yes"/>
    <xsl:template match="/">
        <data>
            <xsl:for-each select="/data/entry">
                <entry>
                    <date>
                        <xsl:value-of select="databit[1]"/>
                    </date>
                    <title>
                        <xsl:value-of select="databit[2]"/>
                    </title>
                    <info>
                        <xsl:value-of select="databit[3]"/>
                    </info>
                    <category>
                        <xsl:value-of select="databit[4]"/>
                    </category>
                    <status>
                        <xsl:value-of select="databit[5]"/>
                    </status>
                </entry>
            </xsl:for-each>
        </data>
    </xsl:template>
</xsl:stylesheet>

しかし、私は . を変換する方法がわかりませんinfo

4

1 に答える 1

2

このスタイルシートは、目的の変換を作成する必要があります。スタイルシートは、キーと値が常に で区切られていると想定し:、コロンとスペース文字を削除しますが、他の文字は削除しません。normalize-space()空白の削除が必要な場合に使用します。

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

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

    <xsl:template match="databit[1]">
        <date>
            <xsl:apply-templates/>
        </date>
    </xsl:template>

    <xsl:template match="databit[2]">
        <title>
            <xsl:apply-templates/>
        </title>
    </xsl:template>

    <xsl:template match="databit[3]">
        <info>
            <xsl:apply-templates/>
        </info>
    </xsl:template>

    <xsl:template match="databit[3]/text()">
        <part key="{substring-before(., ':')}" value="{substring(substring-after(., ':'), 2)}"/>
    </xsl:template>

    <xsl:template match="databit[3]/br"/>

</xsl:stylesheet>

スタイルシートのポイント

  • 要素に独自のテンプレートがない限り、すべての要素は ID テンプレートを使用して再帰的にコピーされます。
  • <databit>3 番目の要素のすべてのテキスト ノードは、キーと値のペアであると想定されます。
  • <part>要素内の属性は、中括弧 (属性値テンプレート) 内の XPath 式を使用して追加されます。それらを追加する他の方法は、<xsl:attribute>要素を使用することです。
  • 空のテンプレートを使用すると、要素<br>のコピーが抑制されます。
于 2013-02-19T23:56:30.380 に答える