给定以下 XML:
<?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>
我需要选择一组翻译元素,以便该集合包含“名称”属性的唯一值,以及给定语言环境的“最佳匹配”('en-US'、'es-MX'、'fr'、 ETC。)。当我说最佳匹配时,我想首先查找具有完全匹配语言环境的元素,然后仅根据前两个字符查找匹配,然后查找未指定语言的元素。
例如,如果我在转换上述数据时传入“en-CA”的语言环境,我想得到以下两个元素:
<Translation name="Resource" lang="en-CA">Canadian English Resource</Translation>
<Translation name="Message" lang="en-CA">Canadian English Message</Translation>
但如果我传入“en-GB”,我想得到:
<Translation name="Resource" lang="en-GB">British English Resource</Translation>
<Translation name="Message" lang="en">English Message</Translation>
最后,如果我传入一个诸如“es”或“es-MX”之类的值,我希望得到:
<Translation name="Resource">Invariant Resource</Translation>
<Translation name="Message">Invariant Message</Translation>
我对 XSLT 非常陌生,但我认为我有一些有用的东西。我只需要知道是否有更好的方法(更简单、更优雅、更高效等)
这是我的第一次尝试:
<?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>
这是我第一次发布问题,所以如果我需要添加/编辑/删除任何内容,请告诉我。
谢谢!