1

する必要がある:

(1) ルート要素に一意の id 属性を生成する

(2) その id を子要素に追加します

(3) 親要素の名前とシーケンスを子要素の id 属性に追加する

**注 -- 私のマシンには XSLT 2.0 を使用できる XML エディターがありますが、Visual Basic でマクロを実行するときはいつでも、Microsoft xml/xslt プロセッサは xslt 1.0 しか処理できないと思うので、1.0 を好むでしょう。2.0が気に入らないようです。

ソース XML の例:

<root>
<segment>
<para>Text of the segment here.</para>
</segment>
<segment>
<para>Text of the segment here.</para>
<para>Text of the segment here.</para>
</segment>
<segment>
<para>Text of the segment here.</para>
<sub_segment>
<para>Text of the segment here.</para>
</sub_segment>
</segment>
</root>

必要な出力 XML:

<root id="idrootx2x1">
<segment id="idrootx2x1.segment.1">
<para id="idrootx2x1.segment.1.para.1">Text of the segment here.</para>
</segment>
<segment id="idrootx2x1.segment.2">
<para id="idrootx2x1.segment.2.para.1">Text of the segment here.</para>
<para id="idrootx2x1.segment.2.para.2">Text of the segment here.</para>
</segment>
<segment id="idrootx2x1.segment.3">
<para id="idrootx2x1.segment.3.para.1">Text of the segment here.</para>
<sub_segment id="idrootx2x1.segment.3.sub_segment.1">
<para id="idrootx2x1.segment.3.sub_segment.1.para.1">Text of the segment here.</para>
</sub_segment>
</segment>
</root>

これが私がこれまでに持っているXSLTです:

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

<xsl:template match="root">
<xsl:copy>
    <xsl:attribute name="id"><xsl:value-of select="generate-id()"/></xsl:attribute>
    <xsl:apply-templates select="*|@*|text()"/>
</xsl:copy>
</xsl:template>

<xsl:template match="segment | para | sub_segment">
<xsl:copy>
    <xsl:attribute name="id">
        <xsl:value-of select="name(.)"/>.<xsl:number format="1" level="single"/>
    </xsl:attribute>
    <xsl:apply-templates select="*|@*|text()"/>
</xsl:copy>
</xsl:template>
4

1 に答える 1

1

次のように、親の番号付けを子に渡すことができます。

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

<xsl:template match="root">
<xsl:copy>
    <xsl:attribute name="id"><xsl:value-of select="generate-id()"/></xsl:attribute>
    <xsl:apply-templates select="@*|node()">
        <xsl:with-param name="prev_id" select="generate-id()"/>
    </xsl:apply-templates>
</xsl:copy>
</xsl:template>

<xsl:template match="segment|para|sub_segment">
<xsl:param name="prev_id"/>
<xsl:copy>
    <xsl:variable name="cur_id">
        <xsl:value-of select="concat($prev_id,'.',name())"/>.<xsl:number format="1" level="single"/>
    </xsl:variable>
    <xsl:attribute name="id"><xsl:value-of select="$cur_id"/></xsl:attribute>
    <xsl:apply-templates select="@*|node()">
        <xsl:with-param name="prev_id" select="$cur_id"/>
    </xsl:apply-templates>
</xsl:copy>
</xsl:template>

番号付きの要素をラップする番号のない要素が他にある場合は、ID テンプレートを次のように変更します。

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

親の番号付けを転送するように

于 2012-10-05T20:14:57.707 に答える