我的XML文件包含嵌套在<p>
元素内的另一个元素中的子元素。我的XSLT正在提升<p>
元素,但它忽略了<span>
。我知道它与xPath有关,但我无法弄清楚如何使用这个XSLT结构。
<newsItem>
<inlineXml>
<h2>Calendar</h2>
<p><strong><span class="dates">June 16-18:</span>National Conference, Denver</strong></p>
<p><strong><span class="dates">June 19-21:</span>Local Event, Chicago</strong></p>
<inlineXml>
</newsItem>
这是我的XSLT:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="no"/>
<xsl:strip-space elements="*"/>
<xsl:template match="newsItem">
<newsItem><xsl:apply-templates/></newsItem>
</xsl:template>
<xsl:template match="h2">
<h2><xsl:value-of select="normalize-space(.)"/></h2>
</xsl:template>
<xsl:template match="p/strong/span">
<date><xsl:value-of select="."/></date>
</xsl:template>
<xsl:template match="p">
<p><xsl:value-of select="normalize-space(.)"/></p>
</xsl:template>
</xsl:stylesheet>
这是理想的结果:
<newsItem>
<inlineXml>
<h2>Calendar</h2>
<p><date>June 16-18:</date>National Conference, Denver</p>
<p><date>June 19-21:</date>Local Event, Chicago</p>
<inlineXml>
</newsItem>
这可能很简单,但它让我很难过。
由于
答案 0 :(得分:1)
如果你改变:
<xsl:template match="p">
<p><xsl:value-of select="normalize-space(.)"/></p>
</xsl:template>
为:
<xsl:template match="p">
<p><xsl:apply-templates/></p>
</xsl:template>
您的结果将成为:
<?xml version="1.0"?>
<newsItem>
<h2>Calendar</h2>
<p><date>June 16-18:</date>National Conference, Denver</p>
<p><date>June 19-21:</date>Local Event, Chicago</p>
</newsItem>
非常接近预期结果,但缺少<inlineXml>
包装器。这是因为没有模板匹配它,所以如果你添加:
<xsl:template match="inlineXml">
<inlineXml><xsl:apply-templates/></inlineXml>
</xsl:template>
你将完全得到预期的结果。
请注意,现在您有三个非常相似的模板:
<xsl:template match="newsItem">
<newsItem><xsl:apply-templates/></newsItem>
</xsl:template>
<xsl:template match="p">
<p><xsl:apply-templates/></p>
</xsl:template>
<xsl:template match="inlineXml">
<inlineXml><xsl:apply-templates/></inlineXml>
</xsl:template>
可以拼凑成一个:
<xsl:template match="newsItem | inlineXml | p">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>