2011-11-25 34 views
5

Tôi muốn dịch một tệp XML nhất định (đó là một ngữ pháp RelaxNG) sang các ngôn ngữ khác thông qua XSLT. Giả sử các tập tin XML là:Sử dụng XSLT để dịch một tệp XML

<?xml version="1.0" encoding="UTF-8"?> 
<grammar> 
    <element name="table" /> 
    <element name="chair" /> 
</grammar> 

Bây giờ tôi đã nghĩ đến việc có một kiểu XSLT với các thông tin như

en=table, de=Tisch, fr=table 
en=chair, de=Stuhl, fr=chaise 
... (there will be many, many more entries) 

Nhưng tôi cũng có thể đưa thông tin này vào một tập tin bên ngoài (Tôi bắt đầu từ vết trầy). Bạn có thể cho tôi lời khuyên làm thế nào để xây dựng một XSLT? Tôi đã suy nghĩ của việc sử dụng <xsl:key> cho điều này nhưng tôi không bao giờ nhận được hang của các phím trong XSLT. Kết quả sẽ giống như thế này, khi tôi tạo ra các bản dịch tiếng Đức:

<?xml version="1.0" encoding="UTF-8"?> 
<grammar lang="de"> 
    <element name="Tisch" /> 
    <element name="Stuhl" /> 
</grammar> 

Trả lời

6

chuyển đổi này:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:param name="pFrom" select="'en'"/> 
<xsl:param name="pTo" select="'de'"/> 

<xsl:key name="kIdByLangVal" match="@dId" 
    use="concat(../../@lang, '+', ../@value)"/> 

<xsl:key name="kValByLangId" match="@value" 
    use="concat(../../@lang, '+', ../@dId)"/> 

<xsl:variable name="vDicts" select= 
    "document('file:///c:/temp/delete/dicts.xml')"/> 

<xsl:template match="node()|@*"> 
    <xsl:copy> 
    <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="@name"> 
    <xsl:variable name="vCur" select="."/> 

    <xsl:attribute name="name"> 
    <xsl:for-each select="$vDicts"> 
    <xsl:value-of select= 
    "key('kValByLangId', 
      concat($pTo, '+', 
       key('kIdByLangVal', 
        concat($pFrom, '+', $vCur) 
        ) 
       ) 
     ) 
    "/> 
    </xsl:for-each> 
    </xsl:attribute> 
</xsl:template> 
</xsl:stylesheet> 

khi áp dụng trên tài liệu XML cung cấp:

<grammar> 
    <element name="table" /> 
    <element name="chair" /> 
</grammar> 

và có tệp C:\temp\delete\dicts.xml:

<dictionaries> 
<dictionary lang="en"> 
    <word dId="1" value="table"/> 
    <word dId="2" value="chair"/> 
</dictionary> 
<dictionary lang="de"> 
    <word dId="1" value="Tisch"/> 
    <word dId="2" value="Stuhl"/> 
</dictionary> 
</dictionaries> 

tạo ra truy nã, chính xác kết quả:

<grammar> 
    <element name="Tisch"/> 
    <element name="Stuhl"/> 
</grammar> 
+0

Cách stylesheets xsl trông lúc nào cũng dọa wits ra khỏi tôi. ;) – DanMan

+2

@DanMan: Điều sợ hãi * tôi * là giao diện của mã lệnh giống như mã spaghetti :) –

+0

Trước hết: cảm ơn Dimitre, bạn luôn đăng câu trả lời tuyệt vời! Hiện tại tôi không quá hài lòng với từ điển dài (khi tôi có 100 mục, rất khó để xem số chính xác là gì). Tôi nên nghĩ về điều này trước. Tôi hiện đang chơi với giải pháp của bạn và cố gắng áp dụng nó vào một từ điển với phong cách sau: ''. – topskip

Các vấn đề liên quan