2010-09-06 37 views
7

Tôi đang cố gắng chuyển đổi một tệp XML với không gian tên sau, nhưng không thể tìm ra cách để làm cho nó hoạt động với không gian tên mặc định mà không thêm tiền tố vào XML đầu ra.XSLT chuyển đổi XML với không gian tên mặc định mà không cần thêm tiền tố?

tập tin XML gốc:

<pExport xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://workflow.converga.com.au/compass"> 

tôi có thể làm cho nó làm việc bằng cách thêm một tiền tố để không gian tên mặc định (người cuối cùng), nhưng làm thế nào có thể tôi ra một XML mà không cần thêm một tiền tố, có thể bởi sử dụng XslCompiledTransform trong .NET 4?

+0

Có vẻ như bạn có thể * không * tìm cách để làm cho nó hoạt động với không gian tên mặc định mà không cần thêm tiền tố vào XML đầu ra. Theo cách nào thì nó không hoạt động? Hành vi được quan sát là gì, khi bạn không thêm tiền tố? Bạn đã gắn thẻ điều này với XSLT, vì vậy có lẽ bạn có nghĩa là một bộ xử lý XSLT không nhận ra phần tử pExport trong không gian tên công việc/la bàn? Cần thêm thông tin. Nó có thể giúp hiển thị phần có liên quan của biểu định kiểu của bạn. – LarsH

+0

Câu hỏi hay (+1).Xem câu trả lời của tôi cho một ví dụ cụ thể và giải pháp được sử dụng. –

+0

LarsH, có ý tôi là không thêm tiền tố, XSLT đầu ra sẽ không thể khớp các nút với không gian tên mặc định (không có thẻ). Tôi đang tìm kiếm một cách để phù hợp với các yếu tố này mà không cần thêm tiền tố của riêng tôi cho không gian tên mặc định. –

Trả lời

4

tôi có thể làm cho nó làm việc bằng cách thêm một tiền tố đến không gian tên mặc định (người cuối cùng ), nhưng làm thế nào có thể tôi ra một XML mà không cần thêm một tiền tố, nó là càng tốt bằng cách sử dụng XslCompiledTransform trong. NET 4?

Đây là một ví dụ cụ thể như thế nào để làm điều đó:

chuyển đổi này:

<xsl:stylesheet version="1.0" 
xmlns="http://workflow.converga.com.au/compass" 
xmlns:c="http://workflow.converga.com.au/compass" 
xmlns:ext="http://exslt.org/common" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
exclude-result-prefixes="c ext xsl"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:param name="pnewItem"> 
    <item name="wine"> 
    <price>3</price> 
    <quantity>5000</quantity> 
    </item> 
</xsl:param> 

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

<xsl:template match="c:item[last()]"> 
    <xsl:call-template name="identity"/> 
    <xsl:copy-of select="ext:node-set($pnewItem)/*"/> 
</xsl:template> 
</xsl:stylesheet> 

khi áp dụng với XslCompiledTransform trên tài liệu XML sau:

<pExport xmlns="http://workflow.converga.com.au/compass"> 
<Goods> 
    <item name="tobacco"> 
    <price>5</price> 
    <quantity>1000</quantity> 
    </item> 
</Goods> 
</pExport> 

tạo ra muốn (cùng tài liệu XML với một mục mới được bổ sung), chính xác kết quả:

<pExport xmlns="http://workflow.converga.com.au/compass"> 
    <Goods> 
    <item name="tobacco"> 
     <price>5</price> 
     <quantity>1000</quantity> 
    </item> 
    <item name="wine"> 
     <price>3</price> 
     <quantity>5000</quantity> 
    </item> 
    </Goods> 
</pExport> 
+0

Cảm ơn bạn, theo ví dụ của bạn, tôi đã làm cho nó hoạt động bằng cách thêm không gian tên mặc định bổ sung mà không có tùy chọn tiền tố và "loại trừ-kết quả tiền tố". Trên thực tế tôi không hoàn toàn hiểu mã của bạn và làm thế nào họ được giả sử để làm việc (chỉ học XSLT ngày hôm qua). Ví dụ: phần nào trong khối mã đầu tiên của bạn đang hoạt động? –

+0

Một điều nhỏ nhặt, trong XML đầu ra, không gian tên mặc định luôn là không gian tên đầu tiên, tôi có thể thay đổi nó thành cái cuối cùng, đó là vị trí từ XML gốc hay không. –

+0

@pstar: Các đặc tả XSLT và XML W3C không ủy nhiệm bất kỳ thứ tự cụ thể nào cho các thuộc tính và các nút không gian tên. Thứ tự tương đối của họ là "phụ thuộc thực hiện". Điều này có nghĩa là tùy thuộc vào bộ xử lý XSLT cụ thể mà bạn đang sử dụng, bạn không thể kiểm soát thứ tự khai báo không gian tên, hoặc nếu bạn có một số điều khiển, tính năng "" này không thể di chuyển và không được hỗ trợ bởi các bộ xử lý XSLT khác. –

1

Bạn chỉ cần xác định không gian tên mặc định của mình trong XSLT. Nếu bạn cũng xác định một với tiền tố là tốt để bạn có thể chọn các mục từ XML đầu vào một cách dễ dàng:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://workflow.converga.com.au/compass" xmlns:compass="http://workflow.converga.com.au/compass"> 
    <xsl:template match="compass:pExport"> 
    <pExport>...</pExport> 
    ... 

Mẫu ở trên sẽ khớp với phần tử XML đầu vào của bạn - và phần tử chữ được tạo sẽ mặc định không gian tên đầu ra (không gian tên giống nhau). Tất nhiên bạn nên biết rằng trong XML tiền tố không liên quan - hai mục giống nhau nếu chúng có cùng một không gian tên và tên cục bộ, ngay cả khi hai tiền tố được định nghĩa cho một không gian tên đó.

<element xmlns="http://test.com"></element> 
<ns01:element xmlns:ns01="http://test.com"></ns01:element> 

Hai yếu tố trên giống nhau vì chúng có cùng tên đủ điều kiện.

+0

để sao chép phần tử phù hợp với cùng một không gian tên, bạn không cần khai báo một không gian tên mặc định cho đầu ra, lệnh 'copy' cũng hoạt động theo cách đó. –

+0

Tôi nghĩ bạn đúng theo ý nghĩa rằng tiền tố không ảnh hưởng đến không gian tên. Và giải pháp của bạn hoạt động theo nghĩa đó. Những gì tôi đang tìm kiếm là một giải pháp mà không cần thêm tiền tố của riêng tôi vào không gian tên mặc định. –

+0

Tiền tố không liên quan * theo lý thuyết *. Trong thực tế, một số trình phân tích cú pháp không tuân thủ không gian tên nhưng bạn vẫn muốn tạo tài liệu với một trình soạn thảo tương thích. Ngoài ra, các đặc tả của một số standrard dựa trên XML không sử dụng một không gian tên nào cả. – dolmen

4

Điều quan trọng là sử dụng thuộc tính exclude-result-prefixes trên các yếu tố stylesheet.

Có một số giải thích tốt trong số this section trong số XSLT FAQ.

+0

Cảm ơn bạn Dolment để chỉ ra các thông tin cho tôi. Trên thực tế, tôi đã đọc một chút XSLT, nhưng không tìm thấy nó. Đoán câu hỏi thường gặp là một chút quá nhiều thông tin cho tôi. –

+0

Một cách tốt để cảm ơn câu trả lời là bỏ phiếu cho nó nhấp vào mũi tên lên ở phía bên trái. Bạn có thể làm điều đó cho tôi? – dolmen

+0

Đã bỏ phiếu cho Câu hỏi thường gặp về XLT. – Fortisimo

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