无法将模板应用于子元素

时间:2015-09-20 20:59:05

标签: xml xslt-1.0

我的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>

这可能很简单,但它让我很难过。

由于

1 个答案:

答案 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>

另见: https://en.wikipedia.org/wiki/Identity_transform