我几乎算不上 XSLT 的新手 - 我本质上是一名网页设计师,正在破解不再在公司工作的开发人员给我的文件。这是我正在使用的代码(为了保持示例简单,去掉了一堆字段)。它将职位空缺列表转换为 XML。
我想设计一种方法来防止 feed 在输出中包含超过设定数量的
<job>
结果。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" exclude-result-prefixes="xsl in lang user" xmlns:in="http://www.composite.net/ns/transformation/input/1.0" xmlns:lang="http://www.composite.net/ns/localization/1.0" xmlns:f="http://www.composite.net/ns/function/1.0" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:user="urn:my-scripts">
<msxsl:script language="C#" implements-prefix="user">
<msxsl:assembly name="System.Web" />
<msxsl:using namespace="System.Web" />
<msxsl:using namespace="System.IO" />
<msxsl:using namespace="System.Net" />
<![CDATA[
public string HTMLDecode(string JoDesc) {
string jd = JoDesc;
jd = HttpUtility.HtmlDecode(jd);
return jd;
}
]]>
</msxsl:script>
<xsl:output method="xml" version="1.0" encoding="utf-8" />
<xsl:template match="/">
<xsl:element name="jobs">
<xsl:for-each select="//Results">
<xsl:variable name="allElementsExist">
<xsl:if test=".//PositionId and JobDescription">
<xsl:value-of select="'true'" />
</xsl:if>
</xsl:variable>
<xsl:if test="$allElementsExist = 'true'">
<xsl:element name="job">
<xsl:element name="client_job_id">
<xsl:text disable-output-escaping="yes"><![CDATA[</xsl:text>
<xsl:value-of
select=".//PositionId"
disable-output-escaping="yes"
/>
<xsl:text disable-output-escaping="yes">]]></xsl:text>
</xsl:element>
<xsl:element name="description">
<xsl:text disable-output-escaping="yes"><![CDATA[</xsl:text>
<xsl:value-of
select="user:HTMLDecode(JobDescription)"
disable-output-escaping="yes"
/>
<xsl:text disable-output-escaping="yes">]]></xsl:text>
</xsl:element>
</xsl:element>
</xsl:if>
</xsl:for-each>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
我尝试摆弄position(),但失败了,因为它计算每个循环记录,而不仅仅是那些在输出中作为
<job>
元素通过的记录。我也尝试过使用计数器,但据我所知,XSLT 中不存在重新设置变量之类的事情。我在这里阅读了一些有关计数的其他帖子,但当涉及 if:test
并且我不断得出错误的数字时,它们似乎并不适用。
在这种情况下我能做些什么吗?也许是使用我的脚本来增加变量的方法?我看到了一些有关使用“扩展”的其他帖子,但我不太明白如何实现它。
感谢您的指导!
没有直接的方法来限制输出中的元素数量,但是很容易限制从输入中处理的元素数量,并且在您的示例中,这似乎相当于同一件事。
你正在做:
<xsl:for-each select="//Results">
<xsl:variable name="allElementsExist">
<xsl:if test=".//PositionId and JobDescription">
<xsl:value-of select="'true'" />
</xsl:if>
</xsl:variable>
<xsl:if test="$allElementsExist = 'true'">
这是一种非常复杂的做法:
<xsl:for-each select="//Results[.//PositionId and JobDescription]">
并且您可以通过将其扩展为
来将输出的
job
元素数量限制为
$limit
<xsl:for-each select="//Results
[.//PositionId and JobDescription]
[position() < $limit]">
顺便说一句,这是您继承的可怕的 XSLT 代码,但我们将忽略它,因为它与您的问题并不真正相关。