Учитывая следующий XML:XSLT: Как выводить только локализованные данные?
<?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>
Мне нужно выбрать набор элементов перевода таким образом, что набор содержит уникальные значения для «имя» атрибута, и «лучший матч» для данной местности ('ан -US ',' es-MX ',' fr 'и т. Д.). Когда я говорю наилучшее совпадение, я хотел бы сначала найти элемент с полным совпадающим языком, а затем искать совпадение, основанное только на первых двух символах, а затем искать элемент без lang.
Например, если я прохожу в локали «ан-CA» при преобразовании вышеуказанных данных, я хотел бы получить следующие два элемента:
<Translation name="Resource" lang="en-CA">Canadian English Resource</Translation>
<Translation name="Message" lang="en-CA">Canadian English Message</Translation>
Но если я перехожу в «ен- GB», я хотел бы получить:
<Translation name="Resource" lang="en-GB">British English Resource</Translation>
<Translation name="Message" lang="en">English Message</Translation>
и, наконец, если я прохожу в значение, например,„эс“или„эс-МХ“, я бы ожидать, чтобы получить:
<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>
Это мой первый раз отправьте вопрос, поэтому, пожалуйста, дайте мне знать, нужно ли мне добавлять/редактировать/удалять что-либо.
Спасибо!
+1 за хороший первый вопрос. –
обратите внимание, что ваш xsl для 'en-AU', установленный в файле только с' en-CA', 'en-GB' и no' en', не будет выводить результат. Мой ответ, надеюсь, исправляет это также. В конце концов, они могут понять друг друга, если они действительно попытаются, нет? –
В то время как я согласен, они должны понимать друг друга, мои требования очень ясны в отношении того, как они хотят, чтобы языковой резерв работал. Но спасибо, что поймали это. – Nick