【发布时间】:2012-10-05 18:50:06
【问题描述】:
我需要:
(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>
【问题讨论】:
-
令人惊讶的是,您自己将所有这些标签一一标记为代码。下一次,也许可以使用“格式为代码”按钮一次标记整个块?