は、私はすべてのsource/@id
値を付け直すと、更新された値と一致するすべてtarget/@id
を更新したい。このXMLXSLT:同じ@値とコンテキストノードと別のノードに属性値を付け直す
<?xml version="1.0"?>
<root>
<lev1>
<source id="1"/>
<target id="1"/>
</lev1>
<lev1>
<source id="2"/>
<sometag/>
<lev2>
<sometag/>
<target id="2"/>
<target id="4"/>
</lev2>
<source id="4"/>
<sometag/>
<source id="5"/>
<lev2>
<target id="6"/>
</lev2>
</lev1>
</root>
を考えます。私はすべてのノードが元の位置を保持するようにしたいと思いますが、一致する箇所にはtarget/@id
がないコメントを生成したいと思います。
このXSLTは私の出発点だった:
<?xml version='1.0'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name="kTarget" match="target" use="@id"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="source">
<xsl:variable name="newId">
<xsl:number from="/" level="any"/>
</xsl:variable>
<newsource>
<xsl:attribute name="id"><xsl:value-of select="$newId"/></xsl:attribute>
</newsource>
<xsl:call-template name="renumTarget">
<xsl:with-param name="newId"><xsl:value-of select="$newId"/></xsl:with-param>
</xsl:call-template>
</xsl:template>
<xsl:template match="target"/>
<xsl:template name="renumTarget">
<xsl:param name="newId"/>
<xsl:comment>new id : <xsl:value-of select="$newId"/> old id : <xsl:value-of select="@id"/></xsl:comment>
<xsl:element name="newtarget">
<xsl:attribute name="id"><xsl:value-of select="$newId"/></xsl:attribute>
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
は、私は新しいノードを配置することができず、古い値と新しい値を選ぶことができています...しかし。これは、一致する@idが存在しない領域も識別しません。
xsltでoldVal-> newVal種類の関数を持つマップを作成する方法はありますか?
ありがとうございました!
どのように結果は見えるだろうか?空の場所に新しい価値を入れるべきですか? – zx485
id = 3のターゲットがあり、対応するソースがないとします。そして、ソースの番号を付け直すと、id = 3のソースが生成されたとします。old id = 3のターゲットの新しいIDはどうなりますか? –