在xslt中获取其他模板中前面元素的值

时间:2012-06-22 06:23:59

标签: xslt xslt-1.0

来源:

<Data>
    <AB>
        <choice>Disclose</choice>
        <image>
            <img alt="No Image" xlink:href="abcd:202-11587" xmlns="http://www.w3.org/1999/xhtml" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:title="Image" />
        </image>
        <link>abcd</link>
    </AB>
    <AB>
        <choice>All</choice>
        <image>
            <img alt="No Image" xlink:href="abcd:202-2202" xmlns="http://www.w3.org/1999/xhtml" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:title="Image" />
        </image>
        <link>all</link>
    </AB>       
</Data>

XSLT

    <xsl:template match="Data">
         <xsl:for-each select="AB">
         <xsl:variable name="temp" select="choice"/>
            <xsl:choose>
                <xsl:when test="$temp='Disclose'">
                <xsl:apply-templates select="image/node()"/>                  
                </xsl:when>
            </xsl:choose>
         </xsl:for-each>

    </xsl:template>

    <xsl:template match="simple:image/xhtml:img">
    <!-- I want to get the the name of the "choice" here-->

    <!-- some other process-->
    <!-- how to access the value of the <choice> element of that section-->
    <!-- how to access <link> element of that section-->
  </xsl:template>

任何人都可以帮忙完成。

1 个答案:

答案 0 :(得分:2)

首先,由于这可能只是对您的代码示例的疏忽,您在匹配模板中指定了名称空间

<xsl:template match="simple:image/xhtml:img">

但是,您的示例XML中没有对“简单”命名空间的引用,因此在这种情况下它应该只是以下

<xsl:template match="image/xhtml:img">

但是在回答你的问题时,为了获得选择元素,因为你当前在 img 元素上进行了定位,你可以搜索层次结构,就像这样< / p>

<xsl:value-of select="../../choice" />

'..'代表父元素。因此,您将返回 AB 元素,并获取其子选择元素。

同样适用于链接元素

<xsl:value-of select="../../link" />

注意,它不一定是xsl:value-of here,如果有多个 link 元素,则可以使用 xsl:apply-templates

<xsl:apply-templates select="../../link" />

而且,如果您只需要在父图片元素之后发生的链接元素,则可以执行以下操作

<xsl:apply-templates select="../following-sibling::link" />