es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

XPath dinámico para filtrar documentos XML utilizando XSLT

He estado buscando en StackOverflow durante un tiempo pero sin éxito. Mi objetivo es filtrar documentos XML de empleados. El XML de entrada tiene alrededor de 9000 empleados, y tengo varios sistemas de destino que desean un subconjunto de estos registros de empleados basados en diferentes criterios de selección para cada sistema de destino.
Entrada de muestra:

<employees>
  <employee>
    <id>1</id>
    <name>Name1</name>
  </employee>
  <employee>
    <id>2</id>
    <name>Name2</name>
  </employee>
  <employee>
    <id>3</id>
    <name>Name3</name>
  </employee>
  <employee>
    <id>4</id>
    <name>Name4</name>
  </employee>
</employees>

La salida debe tener la misma estructura pero reducir los nodos basados en los criterios de selección (XPATH).
¿Cómo puedo pasar el XPath dinámico a una hoja de estilo XSLT y obtener los empleados filtrados como salida? Por favor, tenga en cuenta que la expresión Xpath completa junto con las condiciones de filtrado se pasan como una cadena.

Salida deseada:

<employees>
  <employee>
    <id>2</id>
    <name>Name2</name>
  </employee>
  <employee>
    <id>3</id>
    <name>Name3</name>
  </employee>
</employees>
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para pasar una expresión XPath dinámica a una hoja de estilo XSLT y obtener los empleados filtrados como resultado, puedes utilizar el atributo “select” del elemento “xsl:apply-templates” en la hoja de estilo XSLT.

    Primero, debes recibir la expresión XPath dinámica como parámetro en la hoja de estilo XSLT. Esto se puede hacer utilizando el elemento “xsl:param”.

    Aquí hay un ejemplo de hoja de estilo XSLT que toma la expresión XPath dinámica como parámetro y filtra los empleados en consecuencia:

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    
      <!-- Recibir expresión XPath dinámica como parámetro -->
      <xsl:param name="filter"></xsl:param>
    
      <xsl:template match="Employees">
        <employees>
          <!-- Aplicar plantillas a nodos filtrados -->
          <xsl:apply-templates select="Employee[$filter]"></xsl:apply-templates>
        </employees>
      </xsl:template>
    
      <xsl:template match="Employee">
        <!-- Copiar nodos de Empleado filtrados -->
        <xsl:copy-of select="."></xsl:copy-of>
      </xsl:template>
    
    </xsl:stylesheet>
    

    Para utilizar esta hoja de estilo, debes pasar la expresión XPath dinámica como parámetro al ejecutar la transformación XSLT. Aquí hay un ejemplo de entrada XML y cómo ejecutar la transformación utilizando la expresión XPath dinámica “//Employee[id > 1]”:

    <employees>
      <employee>
        <id>1</id>
        <name>Nombre1</name>
      </employee>
      <employee>
        <id>2</id>
        <name>Nombre2</name>
      </employee>
      <employee>
        <id>3</id>
        <name>Nombre3</name>
      </employee>
      <employee>
        <id>4</id>
        <name>Nombre4</name>
      </employee>
    </employees>
    
    // Crear transformador XSLT
    TransformerFactory transformerFactory = TransformerFactory.newInstance();
    Transformer transformer = transformerFactory.newTransformer(new StreamSource(new File("filter.xsl")));
    
    // Configurar parámetro de expresión XPath dinámica
    transformer.setParameter("filter", "//Employee[id > 1]");
    
    // Transformar XML de entrada e imprimir resultado
    transformer.transform(new StreamSource(new File("input.xml")), new StreamResult(System.out));
    

    El resultado de esta transformación sería:

    <employees>
      <employee>
        <id>2</id>
        <name>Nombre2</name>
      </employee>
      <employee>
        <id>3</id>
        <name>Nombre3</name>
      </employee>
    </employees>
    

    Este resultado coincide con el resultado deseado especificado en la pregunta.

Comments are closed.