使用xslt </i> </italic>替换<i>替换<italic>

时间:2013-09-13 12:12:18

标签: xml xslt

我必须将元素“italic”转换为“i”,我找到了一些解决方案,但是当我将该代码放入新的xsl文件时,我从网站获得的那些解决方案正在工作,但是如果我把它放在现有的xsl它无法正常工作。

我得到的解决方案:

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

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

但我有以下xsl:

<xsl:template match="/">
<xsl:message>Inside root</xsl:message>
    <xsl:apply-templates select="/root/ISSUES" />
</xsl:template>
    <xsl:template match="/root/ISSUES">
            some logic follows here( it might even internally call many templates)
    </xsl:template>

有人能告诉我在这个xsl中放置解决方案(首先给出的代码)的位置吗?

谢谢, 希亚姆

2 个答案:

答案 0 :(得分:1)

基本上,您需要在模板中确保子节点的处理保持不变,因此您需要在所有模板中拥有<xsl:apply-templates/>(或<xsl:apply-templates select="@* | node()"/>,如果您还想转换或复制属性)匹配可包含italic元素的元素。因此,您当然可以编写与root/ISSUES匹配的模板,但您需要确保通过执行<xsl:apply-templates/>来保持对孩子的处理。

答案 1 :(得分:0)

添加

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

只。属性和节点的处理将由其余代码处理。该示例显示了在没有任何逻辑的情况下如何进行复制。您的解决方案将如下所示:

<xsl:template match="/">
<xsl:message>Inside root</xsl:message>
    <xsl:apply-templates select="/root/ISSUES" />
</xsl:template>
    <xsl:template match="/root/ISSUES">
            some logic follows here( it might even internally call many templates)
    </xsl:template>
<xsl:template match="italic">
    <I>
        <xsl:apply-templates select="@* | node()"/>
    </I>
</xsl:template>