2011-09-01 48 views
5

tôi đang cố tạo một phép biến đổi mà đầu ra sẽ là văn bản nhưng bao gồm cả xml gốc. Đơn giản chỉ cần tôi nhận được thông điệp xml mà nên được chuyển sang chèn SQL nhưng trong trường hợp của một lỗi SQL tôi muốn chèn thông điệp xml gốc vào cơ sở dữ liệu là tốt.XSLT - làm thế nào để đưa XML gốc vào kết quả chuyển đổi ở chế độ đầu ra văn bản

Đầu vào là ví dụ:

<message><tag name="foo">dummy</tag></message> 

Kết quả của việc chuyển đổi nên sau đó:

INSERT INTO table (column) VALUES ('dummy') 
IF @@error <> 0 
BEGIN 
    INSERT INTO errMsgLog (message) VALUES ('<message><tag name="foo">dummy</tag></message>') 
END 

Vấn đề là nếu tôi đặt ra trong XSLT để 'text' không có xml bao gồm các thẻ (chỉ các giá trị). Vì vậy, có bất kỳ chế độ đầu ra hỗn hợp hoặc ghi đè thuộc tính?

Cảm ơn bạn đã được trợ giúp.

Trả lời

4

Trước khi tiếp cận giải pháp này (không biết nếu thông qua XSLT bạn có thể tìm thấy một số giải pháp tốt hơn), cũng xem xét các vấn đề bạn sẽ gặp phải với đầu vào và đầu ra phức tạp hơn nhiều.

Ngay cả khi chủ nghĩa thuần túy sẽ từ chối câu trả lời này (và câu hỏi cũng), bạn có thể sử dụng "xml" phương pháp đầu ra để làm một (rất xấu xí) lừa đảo:

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

    <xsl:template match="/"> 
     <xsl:text disable-output-escaping="yes">INSERT INTO table (column) VALUES ('dummy') 
IF @@error &lt;> 0 
BEGIN 
    INSERT INTO errMsgLog (message) VALUES ('</xsl:text> 
     <xsl:copy-of select="."/><xsl:text>') 
END</xsl:text> 
    </xsl:template> 

</xsl:stylesheet> 

kết quả đầu ra:

INSERT INTO table (column) VALUES ('dummy') 
IF @@error <> 0 
BEGIN 
    INSERT INTO errMsgLog (message) VALUES ('<message><tag name="foo">dummy</tag></message>') 
END 
+0

Cảm ơn bạn đã có ý tưởng hay. Tất cả những gì tôi phải làm là không đặt chế độ đầu ra ở tất cả (chỉ có omit-xml-declaration = "yes"). –

+0

Có trong ví dụ của tôi. Điều này là do xml là phương thức đầu ra mặc định. –

1

Một số bộ xử lý (ví dụ Saxon) có chức năng mở rộng serialize() cho phép bạn chuyển đổi một nút XML thành một biểu diễn XML được tuần tự hóa, mà hàm trả về dưới dạng một chuỗi. Bạn có thể gọi nó và sau đó xuất nó trong kết quả văn bản của bạn. Nếu bộ xử lý của bạn không có chức năng mở rộng như vậy, thì có thể không khó để viết một bộ xử lý.

+0

Có một ** [chủ đề tốt] (http://stackoverflow.com/questions/6696382/xslt-how-to-convert-xml-node-to-string) ** trong SO về điều này, nếu tôi hiểu những gì @Michael đang đề xuất (+1) –

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