1

私はxmlを持っています:

<graph>
<node id="a" />
<node id="b" />
<node id="c" />
<node id="d" />

<link from="a" id="link1" to="b"/>
<link from="b" id="link2" to="d"/>
<link from="d" id="link3" to="c"/>

</graph>

xslt で次の xml に変換したい:

<graph>
<node id="a">
    <link id="link1" to="b">
</node>
<node id="b">
    <link id="link2" to="d">
</node><node id="c">
<node id="c"/>
<node id="d">
    <link id="link3" to="c">
</node>
</graph>

次の部分を含むxsltを書きました:

<xsl:template match="//node">
    <xsl:element name="link">
            <xsl:attribute name="to">
                <xsl:value-of select="//link[@from = self::node()/@id]/@to"></xsl:value-of>
            </xsl:attribute>
    <xsl:apply-templates />     
    </xsl:element>


</xsl:template>

しかし、これはうまくいきませんでした。私が間違っていることは何ですか?

4

1 に答える 1

1

XSLT はlink要素のみを作成しますが、何らかの方法graphnode要素も作成する必要があります。また、self::node()述語では期待どおりに機能しません。current()代わりに関数を使用してください。

タスクを解決するには、恒等変換から始めて、特別な処理が必要なノードのテンプレートを追加することをお勧めします。次に例を示します。

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

<xsl:template match="graph">
    <xsl:copy>
        <!-- Only process node children -->
        <xsl:apply-templates select="node"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="node">
    <xsl:copy>
        <!-- Also process matching links -->
        <xsl:apply-templates select="@* | //link[@from = current()/@id]"/>
    </xsl:copy>
</xsl:template>

<!-- Don't copy @from attribute of links -->
<xsl:template match="link/@from"/>
于 2013-05-12T00:04:36.703 に答える