¿Hay alguna forma de restringir la salida de un XSLT a una cantidad específica de registros?

Resuelto Drew asked hace 9 meses • 0 respuestas

Apenas soy un novato en XSLT; esencialmente soy un diseñador web que está pirateando un archivo que me dieron desarrolladores que ya no trabajan en la empresa. Aquí está el código con el que estoy trabajando (menos un montón de campos sólo para mantener el ejemplo simple). Convierte una lista de ofertas de trabajo a XML.

Me gustaría idear una manera de evitar que el feed incluya más de un número determinado de <job>resultados en el resultado.

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

Intenté jugar con position(), lo cual falló porque contaba cada registro en bucle y no solo aquellos que lograron pasar como <job>elementos en la salida. También intenté usar un contador, pero según he aprendido, no existe nada parecido a restablecer una variable dentro de XSLT. Leí algunas de las otras publicaciones aquí sobre recuentos, pero no parecen aplicarse cuando hay if:testnúmeros involucrados y sigo obteniendo números incorrectos.

¿Hay algo que pueda hacer en este escenario? ¿Quizás una forma de incrementar una variable usando mis scripts? Vi algunas otras publicaciones sobre el uso de una 'extensión' pero realmente no entendí cómo implementarla.

¡Gracias por cualquier orientación!

Drew avatar Feb 16 '24 22:02 Drew
Aceptado

No existe una forma directa de limitar la cantidad de elementos en la salida, pero es fácil limitar la cantidad de elementos que procesa desde la entrada y, en su ejemplo, eso parece equivaler a lo mismo.

Estás haciendo:

 <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'">

que es una forma muy complicada de hacer:

<xsl:for-each select="//Results[.//PositionId and JobDescription]">

y puede limitar el número de jobelementos de salida $limitextendiendo esto a

<xsl:for-each select="//Results
      [.//PositionId and JobDescription]
      [position() &lt; $limit]">

Por cierto, este es un código XSLT horrible que has heredado, pero lo ignoraremos porque no es realmente relevante para tu pregunta.

Michael Kay avatar Feb 16 '2024 17:02 Michael Kay