2012-01-16 31 views
7

Tôi đang làm việc để quốc tế hóa thêm vào XSL của tôi. Tôi đã nhìn thấy rất nhiều ví dụ về việc tạo một tệp dictionary.xml và tải nó vào XSL của tôi thông qua tài liệu ('dictionary.xml'). Tôi muốn làm một cái gì đó tương tự, nhưng tôi không muốn tạo và lưu trữ các tập tin dictionary.xml trên đĩa, tôi muốn xây dựng nó từ SQL lúc khởi động máy chủ và giữ đối tượng tài liệu trong bộ nhớ trong Java. Tôi muốn sau đó vượt qua tài liệu từ điển như một tham số cho máy biến áp để chức năng dịch XSL của tôi có thể sử dụng nó. Tuy nhiên, nó dường như không hoạt động.Vượt qua tài liệu dưới dạng tham số để dịch XSL trong Java

liên quan mã Java:

Document dictionary = TranslationDictionary.getDictionaryDocument(); 
transformer.setParameter("dictionary", dictionary); 

Từ điển nội dung tài liệu:

<dictionary xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <translatedString dictionaryId="BASIC_DETAILS"> 
     <language id="es" value="Detalles B&#225;sicos"/> 
    </translatedString > 
    <translatedString dictionaryId="VEHICLE_INFORMATION"> 
     <language id="es" value="Informaci&#243;n del Veh&#237;culo"/> 
    </translatedString > 
    <translatedString dictionaryId="STRUCTURE"> 
     <language id="es" value="Estructura"/> 
    </translatedString > 
    <translatedString dictionaryId="DRIVER_INFORMATION"> 
     <language id="es" value="Informaci&#243;n del Conductor"/> 
    </translatedString > 
    <translatedString dictionaryId="MAINTENANCE_AND_FEUL"> 
     <language id="es" value="Mantenimiento &amp; Combustible"/> 
    </translatedString > 
    <translatedString dictionaryId="PURCHASING"> 
     <language id="es" value="Compra"/> 
    </translatedString > 
</dictionary> 

Các tập tin XSL:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:dc="http://www.test.com"> 
    <xsl:param name="dictionary"/> 
    <xsl:param name="language" select="'es'"/> 


<xsl:template match="/"> 
<xsl:message> 
    <xsl:copy-of select="$dictionary/dictionary/translatedString[@dictionaryId='BASIC_DETAILS']/language[@id='es']/@value"/> 
</xsl:message> 

</xsl:template> 

Nhưng tôi nhận được gì. Tôi đã thử chỉ cần làm một bản sao của tài liệu $/tài liệu để xác nhận rằng tôi không có một vấn đề xpath, và nó không phải là, bởi vì điều đó mang lại cho tôi một bản sao của tài liệu đầy đủ. Nó giống như XSL đang nhìn thấy từ điển $ như một chuỗi thay vì một nút. Bất kì manh mối nào?

+0

Tôi đang sử dụng Saxon9 làm XSLT của mình, nếu điều đó giúp –

+0

Điều đó giúp và chỉ ra thực tế rằng câu hỏi này là bộ xử lý XSLT cụ thể và như vậy thuộc về thẻ "xsltprocessor". –

Trả lời

4

Ok, tôi đã tạo bản sao bộ mã của bạn. Điều này sẽ âm thanh kỳ quái, nhưng sau khi bạn tạo tài liệu từ điển của bạn trong các mã java, và trước khi bạn đặt nó như là một tham số cho biến thế, chỉ cần gọi phương pháp:

dictionary.getDocumentElement(); 

sau đó nó hoạt động! Trông giống như một lỗi trong cách saxon đang xử lý một tham số thats một tài liệu, nơi mà nó đòi hỏi một số loại initialisation mà didnt được thực hiện? Tôi không đào sâu vào trình gỡ rối.

+0

Tôi đã thử một cách khác để tạo Tài liệu DOM và sau đó nhận thấy rằng mặc dù trong thông báo XSL phần tử gốc là "từ điển", nếu tôi đã viết tài liệu vào đĩa thì đó là "Từ điển". Một khi tôi thay đổi xpath của tôi nó làm việc. Cảm ơn! –

-2

Việc thay đổi

select="$dictionary 

để

select="node-set($dictionary) 

giúp đỡ?

+0

Nope it doesnt help –

+0

Bạn đang nói về cái gì? Nếu có lỗi trong trình phân tích cú pháp đã khiến $ dictionary vì một lý do nào đó được coi là giá trị vô hướng chứ không phải là tập hợp nút thì nó sẽ xác định nguyên nhân của vấn đề. Khi điều đó xảy ra, hành vi của anh ta gây ra bởi một lỗi trong bộ phân tích cú pháp saxon (như tôi đã phát hiện ra và sau đó được đăng), không phải cái này đặc biệt. – user467257

+0

"xác định nguyên nhân của vấn đề" - và có khả năng cố định nó quá, tôi nên có thêm, nếu cuộc gọi tập hợp nút buộc phải giải thích loại vào đúng định dạng (nếu giải thích loại đã được nguyên nhân). – user467257

8

Sử dụng URIResolver thay vì tham số. Đầu tiên, tạo resolver như thế này:

public class DocURIResolver implements URIResolver { 

    final Map<String, Document> documents; 

    public DocURIResolver(final Map<String, Document> documents) { 
     this.documents = documents; 
    } 

    public Source resolve(final String href, final String base) { 
     final Document doc = documents.get(href); 
     return (doc != null) ? new DOMSource(doc) : null; 
    } 
} 

Sử dụng nó như thế này:

Document dictionary = TranslationDictionary.getDictionaryDocument(); 
Map<String, Document> docs = new HashMap<String, Document>(); 
docs.put("dictionary", dictionary); 
// transformer is your javax.xml.transform.Transformer 
transformer.setURIResolver(new DocURIResolver(docs)); 

Và tham khảo nó trong stylesheet của bạn bằng tên:

<xsl:variable name="dict" select="document('dictionary')"/> 

Đây chỉ là một ví dụ đồ chơi, tất nhiên. Bạn có thể tạo URIResolver làm đầy đủ tính năng nếu cần.

+0

Tôi không muốn sử dụng URIResolver tùy chỉnh. Bất kỳ suy nghĩ nào khác? –

+0

@DannyCohn - Bất kỳ lý do cụ thể nào? –

+0

Có vẻ như một lớp phức tạp bổ sung không cần thiết. Nếu tôi phải làm như vậy, nhưng tôi không nghĩ rằng những gì tôi đang làm là đủ phức tạp để yêu cầu URIResolver, vì vậy tôi muốn thử cái gì đó ít hack-ish đầu tiên –

3

Việc chuyển nút DOM Document làm tham số cho phép chuyển đổi Saxon sẽ hoạt động (DOM không phải là biểu diễn cây hiệu quả nhất, theo một chặng đường dài, nhưng nó sẽ hoạt động). Vì vậy, nên đi qua DOMSource kết thúc tốt đẹp Tài liệu DOM. Tôi thường bắt đầu bằng cách thực hiện xsl: copy-of select = "$ doc" và dường như bạn đã thực hiện điều này và xác nhận rằng giá trị đang được chuyển chính xác. Nếu bạn không nhận được bất cứ điều gì để đáp ứng với các lựa chọn XPath trong tài liệu, điều này thường có nghĩa là các biểu thức XPath là sai. Những lý do thông thường nhất là quên đi nút gốc (tài liệu) và quên đi các không gian tên. Nhưng tôi e rằng không có bằng chứng về những sai lầm như vậy trong mã bạn đã cho chúng tôi thấy - giả sử DOM phản ánh XML bạn đã hiển thị trong bài đăng của mình.

Bài đăng của bạn cho thấy rằng bạn đã xây dựng Tài liệu DOM theo lập trình. Có thể bạn đã tạo một DOM mà Saxon không thể xử lý vì một số lý do: các giao diện DOM không thực sự mạnh mẽ và đôi khi có những khó khăn khi mọi người sử dụng triển khai DOM chưa được thử nghiệm với Saxon.

Bạn cũng có thể kiểm tra biểu định kiểu của mình bằng cách chạy nó từ dòng lệnh - bạn có thể cung cấp giá trị của tham số $ dictionary bằng cách sử dụng + dictionary = dict.xml (dấu '+' hàng đầu làm cho nó được nhận dạng như tên tệp cần được phân tích cú pháp).

+0

Tôi sẽ thử điều này khi tôi đến văn phòng. Tôi cũng sẽ cố gắng xây dựng tài liệu DOM một cách khác để xác nhận rằng nó được xây dựng đúng cách. Bạn nói rằng DOM không phải là biểu diễn cây hiệu quả nhất. Bạn có thể giới thiệu cái gì khác không? Tôi chắc chắn cởi mở để thay đổi điều đó. –

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