有没有办法将 XSLT 的输出限制为特定数量的记录?

问题描述 投票:0回答:1

我几乎算不上 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">&lt;![CDATA[</xsl:text>
              <xsl:value-of
                select=".//PositionId"
                disable-output-escaping="yes"
              />
              <xsl:text disable-output-escaping="yes">]]&gt;</xsl:text>
            </xsl:element>

            <xsl:element name="description">
              <xsl:text disable-output-escaping="yes">&lt;![CDATA[</xsl:text>
              <xsl:value-of
                select="user:HTMLDecode(JobDescription)"
                disable-output-escaping="yes"
              />
              <xsl:text disable-output-escaping="yes">]]&gt;</xsl:text>
            </xsl:element>
          </xsl:element>
        </xsl:if>
      </xsl:for-each>
    </xsl:element>
  </xsl:template>
</xsl:stylesheet>

我尝试摆弄position(),但失败了,因为它计算每个循环记录,而不仅仅是那些在输出中作为

<job>
元素通过的记录。我也尝试过使用计数器,但据我所知,XSLT 中不存在重新设置变量之类的事情。我在这里阅读了一些有关计数的其他帖子,但当涉及
if:test
并且我不断得出错误的数字时,它们似乎并不适用。

在这种情况下我能做些什么吗?也许是使用我的脚本来增加变量的方法?我看到了一些有关使用“扩展”的其他帖子,但我不太明白如何实现它。

感谢您的指导!

xml xslt
1个回答
0
投票

没有直接的方法来限制输出中的元素数量,但是很容易限制从输入中处理的元素数量,并且在您的示例中,这似乎相当于同一件事。

你正在做:

 <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() &lt; $limit]">

顺便说一句,这是您继承的可怕的 XSLT 代码,但我们将忽略它,因为它与您的问题并不真正相关。

© www.soinside.com 2019 - 2024. All rights reserved.