在模板中多次使用Xml标记
如何使用xslt使最晚的日期出现在顶部在模板中多次使用Xml标记,xml,xslt,Xml,Xslt,如何使用xslt使最晚的日期出现在顶部 <records> <LATEST_TITLE> <LATEST_DATE>2013-12-10</LATEST_DATE> <TITLE>abc</TITLE> </LATEST_TITLE> <LATEST_TITLE> <LATEST_DATE>2013-12-13</LATEST_DATE>
<records>
<LATEST_TITLE>
<LATEST_DATE>2013-12-10</LATEST_DATE>
<TITLE>abc</TITLE>
</LATEST_TITLE>
<LATEST_TITLE>
<LATEST_DATE>2013-12-13</LATEST_DATE>
<TITLE>def</TITLE>
</LATEST_TITLE>
<LATEST_TITLE>
<LATEST_DATE>2013-12-17</LATEST_DATE>
<TITLE>ghi</TITLE>
</LATEST_TITLE>
</records>
我们能否两次使用模板如果您确实希望两个模板匹配同一个元素,可以使用mode属性
<xsl:template match="LATEST_TITLE" mode="date">
<!-- Code here to output the date -->
</xsl:template>
<xsl:template match="LATEST_TITLE" mode="title">
<!-- Code here to output the title -->
</xsl:template>
要调用它们,您需要在应用模板时指定所需的模式
<xsl:apply-templates select="LATEST_TITLE" mode="date" />
<xsl:apply-templates select="LATEST_TITLE" mode="title" />
您真正需要做的唯一额外工作是向第一个apply模板添加xsl:sort,以按日期排序,然后更改匹配的模板,使其仅输出第一个位置的元素
试试这个XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes" />
<xsl:template match="/*">
<xsl:apply-templates select="LATEST_TITLE" mode="date">
<xsl:sort select="LATEST_DATE" order="descending" />
</xsl:apply-templates>
<xsl:apply-templates select="LATEST_TITLE" mode="title" />
</xsl:template>
<xsl:template match="LATEST_TITLE" mode="date">
<xsl:if test="position() = 1">
<xsl:value-of select="LATEST_DATE" />
<xsl:value-of select="' '" />
</xsl:if>
</xsl:template>
<xsl:template match="LATEST_TITLE" mode="title">
<xsl:value-of select="TITLE" />
<xsl:value-of select="' '" />
</xsl:template>
</xsl:stylesheet>
多次使用模板与显示最近日期有什么关系?标题的顺序在这里重要吗?如果不是,您可以按日期对记录进行排序,并且仅当position=1时才输出日期。这确实是您期望的输出吗?也就是说,您只想输出最近的日期,然后按原始顺序输出标题文本?输出的肯定是文本,而不是xml吗?是的,这是唯一的主要问题。我觉得使用两个模板我们可以实现这个输出。第一个模板可用于显示日期,另一个模板可用于显示标题。是的,我需要同样顺序的输出。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes" />
<xsl:template match="/*">
<xsl:apply-templates select="LATEST_TITLE" mode="date">
<xsl:sort select="LATEST_DATE" order="descending" />
</xsl:apply-templates>
<xsl:apply-templates select="LATEST_TITLE" mode="title" />
</xsl:template>
<xsl:template match="LATEST_TITLE" mode="date">
<xsl:if test="position() = 1">
<xsl:value-of select="LATEST_DATE" />
<xsl:value-of select="' '" />
</xsl:if>
</xsl:template>
<xsl:template match="LATEST_TITLE" mode="title">
<xsl:value-of select="TITLE" />
<xsl:value-of select="' '" />
</xsl:template>
</xsl:stylesheet>