从XSLT中访问结果树

时间:2014-02-26 12:20:32

标签: xml xslt tree xslt-1.0

在我的网站上,我有不同类型的标题,例如H1,H2,H3。

但是,我也为这些头条新闻提供了单独的字幕。每个字幕样式都与原始标题的风格有关。

假设这是我的XML代码:

<content type="standard">
    <title>That is my title</title>
    <subtitle>That's my subtitle</subtitle>
    <section>
        <title>Great headline</title>
        <subtitle>Supported by this nice subtitle</subtitle>
        <para>Lorem ipsum sit dolor amet...</para>
        <para>Lorem ipsum sit dolor amet...</para>
    </section>
    <aside>
        <title>Did you know?</title>
        <subtitle>I bet you didn't!</subtitle>
        <para>Lorem ipsum sit dolor amet...</para>
    </aside>
</content>

现在在我的XSL代码中,我将<title/>应用了特殊参数:

<xsl:template match="content/section">

    <!--- apply all titles in section --->
    <xsl:apply-templates select=".//title">
        <xsl:with-param name="role">h2</xsl:with-param>
    </xsl:apply-templates>

    <!--- apply all other stuff --->
    <xsl:apply-templates select="*[not(self::title)]"/>

</xsl:template>

<xsl:template match="content/aside">

    <!--- apply all titles in aside --->
    <xsl:apply-templates select=".//title">
        <xsl:with-param name="role">h3</xsl:with-param>
    </xsl:apply-templates>

    <!--- apply all other stuff --->
    <xsl:apply-templates select="*[not(self::title)]"/>

</xsl:template>

工作正常。但是现在,我有一个通用的字幕模板,它应该根据role param决定做什么,前面的兄弟标题元素已被应用。

<xsl:template match="subtitle">
    <!-- here I want to know:

    what is the local-name()/class attribute
    in the result tree of the preceding-sibling::title in xml

    -->
</xsl:template>

这可能吗?

1 个答案:

答案 0 :(得分:0)

因此,您希望将title元素的section元素与aside元素的子元素区分开来,对吗?

编写两个单独的模板,例如:

<xsl:template match="subtitle[parent::aside]">
   <h3><xsl:value-of select="."/><h3>
</xsl:template>

<xsl:template match="subtitle[parent::section]">
   <h2><xsl:value-of select="."/><h2>
</xsl:template>

此外,模板分辨字幕:

<xsl:template match="aside/subtitle">

等等。

然后,你可以完全取消参数。


另一种编写模板的方法,正如@Michael Kay所建议的那样:

<xsl:template match="aside/title">

结果是一样的。