Dado el siguiente código XML:XSLT: ¿cómo generar solo datos localizados?
<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="form.xsl"?>
<Document>
<Translations>
<Translation name="Resource">Invariant Resource</Translation>
<Translation name="Resource" lang="en">English Resource</Translation>
<Translation name="Resource" lang="en-CA">Canadian English Resource</Translation>
<Translation name="Resource" lang="en-GB">British English Resource</Translation>
<Translation name="Message">Invariant Message</Translation>
<Translation name="Message" lang="en">English Message</Translation>
<Translation name="Message" lang="en-CA">Canadian English Message</Translation>
<Translation name="Message" lang="en-AU">Australian English Message</Translation>
</Translations>
</Document>
necesito seleccionar un conjunto de elementos de traducciones de tal manera que el conjunto contiene valores únicos para el atributo "nombre", y el "mejor partido" para una localidad dada ('en -US ',' es-MX ',' fr ', etc.). Cuando digo mejor coincidencia, me gustaría buscar primero un elemento con la configuración regional completa, luego buscar una coincidencia basada solo en los dos primeros caracteres, luego buscar un elemento sin especificar lang.
Por ejemplo, si paso en un escenario de 'en-CA' al transformar los datos anteriores, me gustaría obtener los dos elementos siguientes:
<Translation name="Resource" lang="en-CA">Canadian English Resource</Translation>
<Translation name="Message" lang="en-CA">Canadian English Message</Translation>
Pero si paso en 'en- GB', me gustaría llegar:
<Translation name="Resource" lang="en-GB">British English Resource</Translation>
<Translation name="Message" lang="en">English Message</Translation>
Y, finalmente, si paso en un valor tal como 'es' o 'ES-MX', que se puede esperar para obtener:
<Translation name="Resource">Invariant Resource</Translation>
<Translation name="Message">Invariant Message</Translation>
Soy muy nuevo en XSLT, pero creo que tengo algo que funciona. Sólo necesito saber si hay una mejor manera de hacerlo (más simple, más elegante, con más prestaciones, etc.)
Aquí es mi primera puñalada en ella:
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output encoding="utf-8" indent="yes" method="xml" omit-xml-declaration="yes"/>
<xsl:key match="Translation" name="TranslationName" use="concat(@name,':',@lang)"/>
<xsl:template match="/">
<!-- locale parameter for translation -->
<xsl:param name="locale"/>
<xsl:for-each select="Document/Translations/Translation[@lang=$locale or @lang=substring($locale,1,2) or not(@lang)]">
<xsl:choose>
<xsl:when test="@lang=$locale and count(key('TranslationName', concat(@name,':',$locale)))=1">
<xsl:element name="p">
<xsl:value-of select="."/>
</xsl:element>
</xsl:when>
<xsl:when test="@lang=substring($locale,1,2) and count(key('TranslationName', concat(@name,':',$locale)))=0">
<xsl:element name="p">
<xsl:value-of select="."/>
</xsl:element>
</xsl:when>
<xsl:when test="not(@lang) and count(key('TranslationName', concat(@name,':',$locale))|key('TranslationName', concat(@name,':',substring($locale,1,2))))=0">
<xsl:element name="p">
<xsl:value-of select="."/>
</xsl:element>
</xsl:when>
</xsl:choose>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Esta es la primera vez que publique una pregunta, por favor avíseme si necesito agregar/editar/eliminar algo.
Gracias!
+1 para una buena primera pregunta. –
tenga en cuenta que su xsl para 'en-AU' establecido en un archivo con solo' en-CA', 'en-GB' y no' en' no generará salida. Mi respuesta, con suerte corrige esto también. Después de todo, se pueden entender si realmente lo intentan, ¿no? –
Aunque estoy de acuerdo, el debería ser capaz de entenderse entre sí, mis requisitos son muy claros acerca de cómo quieren que el lenguaje alternativo funcione. Pero gracias por atrapar eso. – Nick