我有一个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>
答案 0 :(得分:0)
由于您匹配tip[string-length() != 0]
,因此此模板中的上下文是“tip”节点。
使用code
xpath意味着它是tip
元素的子元素,而输入xml中不是这种情况。
使用xpath从code
节点的父节点中选择tip
:
<xsl:copy-of select="../code"/>
或仅复制文字:
<xsl:value-of select="../code"/>