我需要:
(1)为根元素生成唯一的id属性
(2)将该id附加到子元素
(3)将任何父元素的名称和顺序附加到子元素的id属性
**注意 - 我的机器上有一个XML编辑器可以使用XSLT 2.0但更喜欢1.0,因为每当我使用visual basic运行宏时,我认为Microsoft xml / xslt处理器只能处理xslt 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>
答案 0 :(得分: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>
如果有一些其他非编号元素包含编号的1,请将标识模板更改为
<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>
以便转发父编号