在XSLT中使用两次元素

时间:2014-03-18 00:39:00

标签: xml xslt

我有一个XML数据文件,其中包含已经分组和排序的数据。我只需要将它带入并按摩一下。

所以,我创建了XSLT以按照我需要的顺序引入内容,但我想使用两次数据元素,但xsl:copy-of不起作用。这可能是非常简单的事情,但我无法弄清楚。

以下是XSLT的简化版本:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:strip-space elements="*" />
    <xsl:output method="xml" />
    <xsl:template match="/">
        <dataroot>
            <xsl:apply-templates select="dataroot" />
        </dataroot>
    </xsl:template>
    <xsl:template match="CaseStudies">
        <xsl:text></xsl:text>
        <CaseStudies>
            <xsl:apply-templates select="H1" />
            <xsl:text></xsl:text>
            <xsl:apply-templates select="code" />
            <xsl:apply-templates select="tip" />
        </CaseStudies>
    </xsl:template>
    <xsl:template match="code">
        <code>
            <xsl:value-of select="." />
        </code>
    </xsl:template>
    <xsl:template match="tip[string-length() != 0]">
        <xsl:text></xsl:text>
        <Head>Coding Tip for <xsl:copy-of select="code" /></Head>
        <xsl:text></xsl:text>
        <tip>
            <xsl:value-of select="." />
        </tip>
    </xsl:template>
</xsl:stylesheet>

以下是一些示例XML:

<dataroot>
    <CaseStudies>
        <H1>Heading</H1>
        <code>90034</code>
        <tip>Here is the tip text</tip>
    </CaseStudies>
    <CaseStudies>
        <H1>Heading</H1>
        <code>90501</code>
        <tip>Here is the tip text</tip>
    </CaseStudies>
    <CaseStudies>
        <H1>Heading</H1>
        <code>90601</code>
        <tip>Here is the tip text</tip>
    </CaseStudies>
</dataroot>

1 个答案:

答案 0 :(得分:0)

由于您匹配tip[string-length() != 0],因此此模板中的上下文是“tip”节点。 使用code xpath意味着它是tip元素的子元素,而输入xml中不是这种情况。

使用xpath从code节点的父节点中选择tip

<xsl:copy-of select="../code"/>

或仅复制文字:

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