Как получить текущий код страны/локали в XSL?

Я использую преобразование XSL в XML. Некоторая часть преобразования зависит от текущей локали. Есть ли способ найти текущую локаль из XSL?

Например, видимая пользователю сериализация числа с плавающей запятой может различаться в зависимости от локали («1.0» на английском означает «1,0» на немецком), и мое преобразование должно учитывать подобные различия.


person Ramesh Soni    schedule 28.04.2009    source источник
comment
Может быть, мне нужно больше кофе, чтобы наконец проснуться, но какова культура (!) XSL?   -  person Patrick Cornelissen    schedule 28.04.2009
comment
Даже если вы передадите параметр (как предложил @Tomalak), как вы планируете загружать данные, чувствительные к культуре, в файл XSL?   -  person Cerebrus    schedule 28.04.2009
comment
например для немецкой культуры мне нужен другой числовой формат по сравнению с английским   -  person Ramesh Soni    schedule 28.04.2009
comment
Рамеш, люди голосуют против, потому что культура в xSL не имеет смысла. 1. Что такое культура? и 2. Что это в контексте XSL? Опять же, вы имеете в виду что-то вроде кода страны? И если да (или нет), отредактируйте свой вопрос, чтобы люди поняли, что вы имеете в виду. Пока что никто, кажется, полностью не понимает, что вы пытаетесь сделать, в какой среде и как вы это делаете. Больше информации, пожалуйста.   -  person AlexanderJohannesen    schedule 28.04.2009
comment
Я думаю, вы получили бы более положительный ответ, если бы использовали слово «локаль» — это общепринятый термин для концепции, которую вы пытаетесь описать.   -  person Nic Gibson    schedule 28.04.2009
comment
Ах я вижу. Что ж, вы должны предоставить нам номер версии XSLT, с которой вы работаете; есть 1.0 с расширениями или 2.0. Кроме того, было бы полезно немного рассказать об инструментах, поскольку у некоторых процессоров есть особенности, позволяющие открывать локальную поддержку в нужной среде (например, LibXML2 и LibXSLT через PHP могут использовать локальную через это).   -  person AlexanderJohannesen    schedule 28.04.2009


Ответы (2)


Локальные переменные изначально не поддерживаются в XSLT 1.0, но есть способы работать с ними, но вам нужно передать их в качестве параметра процессору XSLT или полагаться на расширения. Некоторые процессоры предоставят вам доступ к информации о локали, но не существует стандартного способа сделать это, и мы должны знать вашу среду, чтобы узнать, возможно ли это. Однако в XSLT 2.0 некоторые функции форматирования даты, времени и чисел будут иметь (иногда ограниченную) поддержку локалей и будут обрабатываться процессором, а не вами (вот почему существуют эти функции:)

Что касается использования той или иной формы локальности в среде XSLT 1.0 и частично в качестве хорошей вещи (TM) независимо от версии XSLT, я бы установил несколько базовых шаблонов для типа данных, с которыми вы работаете, и передал бы локальный параметр in (как объяснялось ранее). Для чисел найдите, например, xsl:format-number.

Что касается других локальных вещей, я бы создал еще один XML-файл и позволил параметру работать в качестве средства выбора информации, которая вам нужна. XML может выглядеть так:

<locals>
   <config id="de">
     <currency notation="&#8352;" format-number="###.###,##" />
     <text id="welcome">Wilcommen!</text>
   </config>
   <config id="en">
     <currency notation="&#163;" format-number="### ###.##" />
     <text id="welcome">Welcome!</text>
   </config>
   <config id="no">
     <currency notation="NOK" format-number="###.###,##" />
     <text id="welcome">Velkommen!</text>
   </config>
</locals>

Отсюда откройте его как ;

<xsl:variable name="locale" select="document('locale.xml')/locals/config[@id=$parameter.for.locale]" />

И вы можете использовать его как таковой для приветственного текста;

<xsl:value-of select="$locale/text[@id='welcome']" />

Для форматирования чисел и т. д. это немного сложнее, но сначала убедитесь, что это правильный путь, и я расширю, но в основном вы должны создать несколько ключей в XML-файле локали и использовать поиск значений по ключу. Для чисел и тому подобного (нужно рассказать мне больше о том, что вы хотите поддерживать), я бы написал пару шаблонов, которые имеют дело с этим, и использовал ;

<xsl:call-template name="my-template">
   <xsl:with-param name="this" select="'some_number'" />
</xsl:call-template>
person AlexanderJohannesen    schedule 28.04.2009

Передайте его как параметр.

<xsl:param name="CultureInfo" select="'default'" />

Поместите параметр XSL на верхний уровень вашей таблицы стилей и задайте его «снаружи» перед вызовом таблицы стилей.

Другой (собственный) способ — зарегистрировать функции расширения и задать их из таблицы стилей.

person Tomalak    schedule 28.04.2009
comment
Нет возможности передать параметры. Есть один xml и один xsl; это оно. - person Ramesh Soni; 28.04.2009
comment
А какой у вас процессор XSLT? - person Tomalak; 28.04.2009
comment
Один xml и один xsl могут принимать параметры. Я не могу придумать сценарий, в котором нельзя было бы передать параметры в XSL. - person Cerebrus; 28.04.2009
comment
Возможность передачи параметров строго не требуется спецификацией IIRC. Некоторые среды или настройки могут сделать это невозможным. Таким случаем может быть XML со встроенным XSLT для преобразования в браузере. - person Tomalak; 28.04.2009
comment
Извините, но я никогда не слышал о такой настройке, когда нельзя передать параметр, даже XSLT через браузер. Приветствуется дополнительная информация от ОП о его окружении. Вся эта культура до сих пор остается большой загадкой после того, как он объяснил ее, так что пока мало надежды на решение, не так ли? :) - person AlexanderJohannesen; 28.04.2009
comment
@AlexanderJohannesen: например: w3schools.com/xsl/xsl_transformation.asp, см. ссылку таблицу стилей XSL в XML-документ. Я не уверен, что вы можете передать параметры в такой настройке. - person Tomalak; 28.04.2009
comment
Ну, есть такие вещи, как ?modxslt-param имя=значение переменной=ее значение? но да, это становится сложнее. Я уверен, что есть уловка JS, чтобы получить значение динамическим или заполненным материалом среды браузера, но мы уходим далеко-далеко от реальности и здравомыслия. В таком случае, наверное, это не так просто. Ты победил. :) - person AlexanderJohannesen; 28.04.2009
comment
@AlexanderJohannesen: не нужно избегать остроконечных скобок в комментариях, они будут отображаться в порядке. - person Tomalak; 28.04.2009