Với XML sau:XSLT: Làm cách nào để xuất dữ liệu được bản địa hóa?
<?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>
tôi cần phải chọn một tập hợp các yếu tố dịch như vậy mà bộ chứa giá trị duy nhất cho "tên" thuộc tính, và "phù hợp nhất" cho một miền địa phương nhất định ('en -US ',' es-MX ',' fr ', v.v.). Khi tôi nói phù hợp nhất, tôi muốn tìm kiếm một phần tử với miền địa phương phù hợp, sau đó tìm kiếm một kết quả dựa trên hai ký tự đầu tiên, sau đó tìm một phần tử không có ngôn ngữ xác định.
Ví dụ, nếu tôi vượt qua trong một miền địa phương của 'en-CA' khi chuyển các dữ liệu trên, tôi muốn có được hai yếu tố sau:
<Translation name="Resource" lang="en-CA">Canadian English Resource</Translation>
<Translation name="Message" lang="en-CA">Canadian English Message</Translation>
Nhưng nếu tôi vượt qua trong 'en- GB', tôi muốn có được:
<Translation name="Resource" lang="en-GB">British English Resource</Translation>
<Translation name="Message" lang="en">English Message</Translation>
Và cuối cùng nếu tôi vượt qua trong một giá trị như 'es' hoặc 'es-MX', tôi sẽ mong đợi để nhận được:
<Translation name="Resource">Invariant Resource</Translation>
<Translation name="Message">Invariant Message</Translation>
Tôi rất mới với XSLT, nhưng tôi nghĩ rằng tôi có một cái gì đó hoạt động. Tôi chỉ cần biết nếu có một cách tốt hơn để làm điều đó (đơn giản, thanh lịch hơn, performant hơn, vv)
Dưới đây là đâm đầu tiên của tôi vào nó:
<?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>
Đây là lần đầu tiên tôi đến đăng câu hỏi, vì vậy hãy cho tôi biết nếu tôi cần thêm/chỉnh sửa/xóa bất kỳ điều gì.
Cảm ơn!
+1 cho một câu hỏi tốt đầu tiên. –
lưu ý rằng xsl của bạn cho 'en-AU' được đặt trên một tệp chỉ với' en-CA', 'en-GB' và không có' en' sẽ không tạo ra kết quả đầu ra. Câu trả lời của tôi, hy vọng cũng sửa chữa điều này. Sau khi tất cả, họ _can_ hiểu nhau nếu họ thực sự cố gắng, không? –
Trong khi tôi đồng ý, có thể hiểu nhau, yêu cầu của tôi rất rõ ràng về cách họ muốn dự phòng ngôn ngữ hoạt động. Nhưng cảm ơn vì đã bắt được điều đó. – Nick